kafka로 restAPI통신
893
작성한 질문수 2
현재 카프카로 서버간의 restAPI 통신을 구현하려고 하는데요
예를들어 게시판 생성 요청을 예로 들어보겠습니다.
게시판에는 멤버정보가 들어가는데요
게시판 생성요청 정보에는
게시판 제목
게시판 내용
멤버 id
가 있구요
게시판 생성요청시에 작성자id 를 가지고 멤버 서버로 멤버 정보를 요청하는 방식을 해보려고 합니다.
카프카를 사용할때
1 . 게시판서버 게시판 생성메서드에서 프로듀서로 작성자id 를 특정 토픽에 보내고 2 . 멤버서버에서 컨슈머 리스너를 통해 해당 토픽에 요청정보가 들어오면
3 . 요청을 처리하고 다시 객체를 반환 해줘야 하는데 이것을 다시 프로듀서로 작성하고
4 . 게시판서버에서 리스너로 응답받은 객체를 생성메서드에 주입시켜 게시판을 완성시키려고 했습니다.
찾아보니 컨슈머리스너는 void 이어야 한다고 하더라구요.
그렇게 되면 요청과 응답을 받는것을 어떻게 한 메서드 안에서 처리 해야 할까요 ?
찾아본 방법으로는 kafka rest proxy 라는것도 찾아봤는데 현업에서 사용하는 방법이 따로 있는지 궁금합니다
답변 1
1
안녕하세요, 인프런 AI 인턴입니다.
Spring Boot에서 카프카를 사용하여 메시지를 전송하고 동기적으로 결과를 처리하기 위한 방법은 몇 가지가 있을 수 있습니다. 하나의 메서드 안에서 요청과 응답을 처리하려면, 별도의 응답 토픽을 사용하고 요청을 보낸 측에서 응답을 기다린 후 처리하는 패턴을 사용할 수 있습니다.
기본적으로 Kafka와 Spring Boot를 통합하여 사용할 때, 프로듀서는 메시지를 특정 토픽에 전송하고, 컨슈머는 리스너를 통해 해당 토픽의 메시지를 비동기적으로 처리합니다. @KafkaListener를 사용하는 방법을 보면, 리스너 메서드는 반환값을 가지지 않고 void 타입이어야 합니다. 이러한 비동기 처리 방식은 요청에 대한 응답을 직접 반환하는 동기적 통신 패턴과는 다릅니다.
그러나 요청과 응답을 한 메서드 안에서 처리하기 위해선 다음과 같은 방법을 사용할 수 있습니다:
- 요청을 보낼 때, 응답을 받을 ‘응답 토픽(Reply Topic)‘과 ‘코렐레이션 ID(Correlation ID)‘를 추적할 수 있는 식별자를 함께 보냅니다.
- 멤버 서버의 컨슈머 리스너가 요청 메시지를 처리한 후, 결과 데이터와 원래의 ‘코렐레이션 ID’를 포함하여 ‘응답 토픽’으로 결과 메시지를 보냅니다.
- 게시판 서버에는 ‘응답 토픽’의 리스너가 있으며, ‘코렐레이션 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
현업에서 적합한 방법은 구현하려는 시스템의 요구 사항과 아키텍처에 따라 다를 수 있으니, 특정한 방법을 채택하기 전에 다른 팀 또는 프로젝트에서 사용하는 방식을 조사하고 검토하는 것이 좋을 것입니다.
mtputty.com 사용하실 때 주의하세요(질문X/공유)
0
11
2
VirtualBox가 아닌 VMware를 사용해도 되나요
0
10
2
Jib 이미지 빌드에서 docker credential 관련으로 이슈가 있다면
1
33
1
스크립트에 대해 질문 있습니다.
1
24
1
같은 사용자가 연속된 중복 호출할 경우 어떻게 되는지 궁금합니다!
1
18
1
조건 검색 질문
0
19
1
WebFlux & Web MVC 혼용해서 사용했을 때 스레드에 대한 질문
0
28
1
댓글 삭제 로직에서 동시성 문제 발생 가능성
0
34
1
재고 감소와 쿠폰 발급은 왜 서로 다른 방식으로 동시성을 제어하나요?
0
45
2
service-discovery 프로세스 가동 이유
0
40
1
DLQ의 수동 커밋에 대해서 질문있습니다.
0
64
2
JWT토큰 발급 시, subject 값을 다양하게 넣어서 여러 개의 토큰을 만드는 이유
0
51
2
ansible playbook 오류
0
61
2
테스트 코드 작성 시 DTO 새로 작성하는 이유가 궁금합니다.
0
62
1
실습 환경 : 파이썬 3.10 관련 문의
0
66
2
rabbitmq에 configservice 연결에 대해 질문있습니다.
0
58
1
kafka 라이선스 오류 문제
0
66
2
Int 값들 null 처리
0
36
1
db table 관련질문
0
38
1
현업에서 prisma relationMode는 사용안하나요?
0
57
1
실무 내용 문의드려요
0
53
2
Kafka Cluster 구성도 질문
0
48
1
38강 클러스터에 컨트롤러 연결 질문
0
76
2
repartition 전후 persist 용량 차이가 나는 이유가 궁금합니다
0
74
1





