개발자

스프링 카프카 컨슈머 역직렬화 관련 질문

2024년 02월 22일조회 499

이번에 팀에서 카프카를 도입하는데 경험이 없어서 조언을 구할려고 합니다. A 애플리케이션에서 카프카 메세지 전송하고 B 애플리케이션에서 컨슈머 처리를 하는데요. 토픽마다 레코드 value의 객체 타입이 다른데 이럴 경우 카프카 컨테이너 리스너 팩토리를 토픽마다 분리해야 할까요?

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 1

인기 답변

이양일님의 프로필 사진

안녕하세요! 말씀해주신 내용이 Spring Kafka 를 쓰고 계신 상황인듯 하여 답변드립니다. 말씀해주신 방법도 틀린 방법은 아니지만, topic 이 추가될때마다 컨테이너 리스너 팩토리를 계속 등록해야한다는 점과 Consumer Thread 가 계속 증가하게 되는게 어글리해보일 수 있는데요, https://docs.spring.io/spring-kafka/reference/kafka/serdes.html#by-topic spring 2.8 버전부터 DelegatingByTopicDeserializer 란게 추가되어 topic name 에 맞게 Deserializer 를 추가할 수 있는 형태로 제공되는듯 하니 참고해보시면 좋을것 같습니다. 저의 짧은 지식이 조금이나마 도움이 되시길 바라겠습니다.

profile picture

익명

작성자

2024년 02월 23일

답변 감사합니다! 제가 이해한 바로는 토픽마다 JsonDeserializer를 등록할 수 있지만 결국 역직렬화 할 객체 타입은 구분 못하지 않을까 생각되는데 제가 잘못 이해한 것일까요??

이양일님의 프로필 사진

이양일

NaverCloud 백엔드 개발자2024년 02월 28일

안녕하세요! 댓글 달아주신걸 늦게 확인했네요ㅠㅠ Consumer 생성 역할을 맡은 DefaultKafkaConsumerFactory 의 생성자를 보시면 Deserializer 를 주입받으실 수 있는데요, 공유드린 공식 문서에선 DefaultKafkaProducerFactory 를 예제로 보여주었지만 이와 비슷한 방향으로 할 수 있다고 판단하였습니다. 다른 방법으로는 Custom Deserializer 를 구현하여, 각 토픽별 맵핑 정보를 configure 를 통해 받아 처리할 수 있는 형태로도 구현이 가능할거라 생각하였습니다. 그리고 아래와 같은 공식 문서를 보면 https://docs.spring.io/spring-kafka/reference/kafka/serdes.html#data-projection JsonMessageConverter 를 통해 변환된 Json 을 @KafkaListener 어노테이션이 선언된 함수 파라미터 타입에 맞게 변환시켜주는 기능도 있는것으로 보입니다. 이부분도 한번 참고해보시고 적절한 방안을 선택해주시면 좋지 않을까 싶습니다.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2024년 02월 22일

Spring Kafka에서는 사용 가능한 방법이 여러 가지입니다. 1. 동일한 소비자 팩토리를 사용하지만, 각 토픽마다 다른 리스너를 등록하는 방법이 있습니다. `@KafkaListener`의 `topics` 매개변수를 이용하여 각 토픽을 지정하고, 해당 리스너는 그 토픽의 메시지 타입에 따라 적절하게 역직렬화됩니다. 2. 또 다른 선택 옵션은 JsonDeserializer를 사용하는 것입니다. 이 경우, 각 메시지가 자체 스키마 정보(JSON 형식)를 포함하므로 서로 다른 타입의 객체도 역직렬화 될 수 있습니다. 3. 또한 개별 Listener Container에 대해 구성을 변경할 수 있는 세부적인 제어가 필요한 경우 컨테이너 팩토리를 분리하는 것이 좋습니다. 따라서 당신의 요구사항에 따라 적절한 방식을 선택해야 합니다. 위에 언급된 첫번째나 두번째 방법은 좀 더 유연성을 제공하지만, 세번째 방법은 각 토픽에 대해 더 세밀한 제어가 가능합니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!