kafka로 restAPI통신

24.02.22 00:31 작성 조회수 199

0

현재 카프카로 서버간의 restAPI 통신을 구현하려고 하는데요

예를들어 게시판 생성 요청을 예로 들어보겠습니다.

게시판에는 멤버정보가 들어가는데요

게시판 생성요청 정보에는

게시판 제목

게시판 내용

멤버 id

가 있구요

게시판 생성요청시에 작성자id 를 가지고 멤버 서버로 멤버 정보를 요청하는 방식을 해보려고 합니다.


카프카를 사용할때

1 . 게시판서버 게시판 생성메서드에서 프로듀서로 작성자id 를 특정 토픽에 보내고 
2 . 멤버서버에서 컨슈머 리스너를 통해 해당 토픽에 요청정보가 들어오면

3 . 요청을 처리하고 다시 객체를 반환 해줘야 하는데 이것을 다시 프로듀서로 작성하고

4 . 게시판서버에서 리스너로 응답받은 객체를 생성메서드에 주입시켜 게시판을 완성시키려고 했습니다.

찾아보니 컨슈머리스너는 void 이어야 한다고 하더라구요.

그렇게 되면 요청과 응답을 받는것을 어떻게 한 메서드 안에서 처리 해야 할까요 ?

찾아본 방법으로는 kafka rest proxy 라는것도 찾아봤는데 현업에서 사용하는 방법이 따로 있는지 궁금합니다

답변 1

답변을 작성해보세요.

1

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.02.23

안녕하세요, 인프런 AI 인턴입니다.

Spring Boot에서 카프카를 사용하여 메시지를 전송하고 동기적으로 결과를 처리하기 위한 방법은 몇 가지가 있을 수 있습니다. 하나의 메서드 안에서 요청과 응답을 처리하려면, 별도의 응답 토픽을 사용하고 요청을 보낸 측에서 응답을 기다린 후 처리하는 패턴을 사용할 수 있습니다.

기본적으로 Kafka와 Spring Boot를 통합하여 사용할 때, 프로듀서는 메시지를 특정 토픽에 전송하고, 컨슈머는 리스너를 통해 해당 토픽의 메시지를 비동기적으로 처리합니다. @KafkaListener를 사용하는 방법을 보면, 리스너 메서드는 반환값을 가지지 않고 void 타입이어야 합니다. 이러한 비동기 처리 방식은 요청에 대한 응답을 직접 반환하는 동기적 통신 패턴과는 다릅니다.

그러나 요청과 응답을 한 메서드 안에서 처리하기 위해선 다음과 같은 방법을 사용할 수 있습니다:

  1. 요청을 보낼 때, 응답을 받을 ‘응답 토픽(Reply Topic)‘과 ‘코렐레이션 ID(Correlation ID)‘를 추적할 수 있는 식별자를 함께 보냅니다.
  2. 멤버 서버의 컨슈머 리스너가 요청 메시지를 처리한 후, 결과 데이터와 원래의 ‘코렐레이션 ID’를 포함하여 ‘응답 토픽’으로 결과 메시지를 보냅니다.
  3. 게시판 서버에는 ‘응답 토픽’의 리스너가 있으며, ‘코렐레이션 ID’를 이용하여 요청과 응답을 매핑하고, 원래 요청을 보낸 메서드에 결과를 전달합니다.

실제 구현 시에는 Kafka의 ReplyingKafkaTemplate 등을 사용하여 요청을 보내고 결과를 동기적으로 받을 수 있습니다. ReplyingKafkaTemplate을 사용하면 요청을 보낸 후 Future 객체를 통해 결과를 비동기적으로 기다린 후, 이를 동기적으로 처리할 수 있습니다.

현업에서는 이러한 요구사항이 있을 때 Kafka Streams 라이브러리를 이용하거나, 별도의 RESTful API 서비스를 Kafka와 연결하여 사용하는 방법 또한 고려할 수 있습니다.

Kafka REST Proxy는 카프카 클라이언트가 설치되지 않은 시스템에서 카프카 토픽에 메시지를 보내거나 받기 위해 REST API를 통해 Kafka에 접근할 수 있게 해주는 것으로, 별도의 카프카 클라이언트 없이도 카프카 서버와 통신할 수 있도록 지원합니다.

참고로 응답 패턴과 관련하여 추가적으로 필요한 정보를 찾으시려면 ‘Spring Boot Reference Documentation’의 “10. Messaging > 10.3. Apache Kafka Support” 부분을 확인하시면 도움이 됩니다.

참고 자료 링크:
- Apache Kafka Support for Spring Boot : Spring documentation

현업에서 적합한 방법은 구현하려는 시스템의 요구 사항과 아키텍처에 따라 다를 수 있으니, 특정한 방법을 채택하기 전에 다른 팀 또는 프로젝트에서 사용하는 방식을 조사하고 검토하는 것이 좋을 것입니다.