inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

kafka로 restAPI통신

917

임띵동

작성한 질문수 2

0

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

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

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

게시판 생성요청 정보에는

게시판 제목

게시판 내용

멤버 id

가 있구요

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


카프카를 사용할때

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

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

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

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

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

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

kafka restapi kafka통신 비동기통신 kafka비동기통신 kafkarestapi

답변 1

1

인프런 AI 인턴

안녕하세요, 인프런 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

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

낙관적락 질문있습니다.

0

35

1

댓글순서부여방식

0

36

1

movablePageCount와 pageSize 상수

0

32

1

JPA와 네이티브 쿼리

0

38

1

11강 [실습] Docker로 MySQL1 분만에 실행하기

0

77

2

11강 [실습] Docker로 MySQL1 분만에 실행하기

0

57

2

구현 방법에 대한 문의

0

65

2

장애 격리 관련해서 궁금한 부분이 있어요

0

49

2

MSA 통신방식에 대해서 질문 있습니다.

0

47

1

4. ArgoCD설치---Base64 디코딩 부분만 PowerShell 방식으로 바꾸어서 설치 필요

0

54

1

안녕하세요 질문있습니다.!

0

56

2

@Modifying에 관하여

1

59

1

개인 git에 코드를 올려도 될지 문의드립니다.

0

62

2

Issuance 테이블에 status, couponId 인덱스가 꼭 필요할까요?

2

75

1

Producer의 동기 전송 및 비동기 전송 관련 질문

0

57

1

부하 테스트 시 설정 관련 질문드립니다

1

109

2

섹션 2

0

55

1

Inner class로 Config를 지정하는 이유

0

58

2

Hive metastore setup중에 오류 발생

0

80

2

ArticleReadService 관련 질문

0

54

1

kafka 이벤트 발행 실패 시 at-least-once를 보장하는 방법이 궁금합니다.

2

122

1

domain에 @Entity 와 Repository를 함께 둔 이유가 궁금합니다

1

104

1

mtputty.com 사용하실 때 주의하세요(질문X/공유)

0

104

2

VirtualBox가 아닌 VMware를 사용해도 되나요

0

81

2