작성
·
589
0
현재 카프카로 서버간의 restAPI 통신을 구현하려고 하는데요
예를들어 게시판 생성 요청을 예로 들어보겠습니다.
게시판에는 멤버정보가 들어가는데요
게시판 생성요청 정보에는
게시판 제목
게시판 내용
멤버 id
가 있구요
게시판 생성요청시에 작성자id 를 가지고 멤버 서버로 멤버 정보를 요청하는 방식을 해보려고 합니다.
카프카를 사용할때
1 . 게시판서버 게시판 생성메서드에서 프로듀서로 작성자id 를 특정 토픽에 보내고 2 . 멤버서버에서 컨슈머 리스너를 통해 해당 토픽에 요청정보가 들어오면
3 . 요청을 처리하고 다시 객체를 반환 해줘야 하는데 이것을 다시 프로듀서로 작성하고
4 . 게시판서버에서 리스너로 응답받은 객체를 생성메서드에 주입시켜 게시판을 완성시키려고 했습니다.
찾아보니 컨슈머리스너는 void 이어야 한다고 하더라구요.
그렇게 되면 요청과 응답을 받는것을 어떻게 한 메서드 안에서 처리 해야 할까요 ?
찾아본 방법으로는 kafka rest proxy 라는것도 찾아봤는데 현업에서 사용하는 방법이 따로 있는지 궁금합니다
답변 1
1
안녕하세요, 인프런 AI 인턴입니다.
Spring Boot에서 카프카를 사용하여 메시지를 전송하고 동기적으로 결과를 처리하기 위한 방법은 몇 가지가 있을 수 있습니다. 하나의 메서드 안에서 요청과 응답을 처리하려면, 별도의 응답 토픽을 사용하고 요청을 보낸 측에서 응답을 기다린 후 처리하는 패턴을 사용할 수 있습니다.
기본적으로 Kafka와 Spring Boot를 통합하여 사용할 때, 프로듀서는 메시지를 특정 토픽에 전송하고, 컨슈머는 리스너를 통해 해당 토픽의 메시지를 비동기적으로 처리합니다. @KafkaListener
를 사용하는 방법을 보면, 리스너 메서드는 반환값을 가지지 않고 void
타입이어야 합니다. 이러한 비동기 처리 방식은 요청에 대한 응답을 직접 반환하는 동기적 통신 패턴과는 다릅니다.
그러나 요청과 응답을 한 메서드 안에서 처리하기 위해선 다음과 같은 방법을 사용할 수 있습니다:
실제 구현 시에는 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
현업에서 적합한 방법은 구현하려는 시스템의 요구 사항과 아키텍처에 따라 다를 수 있으니, 특정한 방법을 채택하기 전에 다른 팀 또는 프로젝트에서 사용하는 방식을 조사하고 검토하는 것이 좋을 것입니다.