Inflearn brand logo image

인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

실전에서 바로 써먹는 Kafka 입문

Kafka concurrency

작성

·

53

·

수정됨

0

안녕하세요, Consumer 서버가 2대라고 가정해보겠습니다.

@KafkaListener의 concurrency 값을 설정을 2으로 설정하였다고 가정한다면, 2개의 스레드가 생성이돼서 병렬적으로 파티션을 처리할텐데

위의 설정 없이 그냥 @KafkaListener가 붙은 메서드에 @Async를 통해서 ThreadPool의 크기를 2으로 설정하였다면, 동일하게 동작하게 되는걸까요?

스프링 MVC의 경우 톰캣 기본 설정이 200 정도의 스레드풀을 할당해서 병렬적으로 처리하는 것으로 알고 있는데, Async대신 KafkaListener의 concurrency 설정을 200으로 하는 것이 맞을까요?

답변 3

0

JSCODE 박재성님의 프로필 이미지
JSCODE 박재성
지식공유자

안녕하세요 ! 질문 잘해주셨어요 ~

질문해 주신 내용에 대해 하나씩 차근차근 설명드려볼게요 ~

 

우선 @KafkaListener의 concurrency와 @Async를 통한 비동기 실행은

비슷해 보이지만 작동 방식이 완전히 달라요 !

"concurrency 설정"은 Kafka Consumer 전용 스레드풀에서 동작해요 !

각 스레드가 특정 파티션을 맡아 메시지를 순차적으로 처리하고,

이 과정에서 메시지 순서 보장이나 offset 관리, 리밸런싱 같은 기능들이 자동으로 처리가 돼요 ~

반면에 "@Async 설정"은 일반적인 Spring ThreadPoolTaskExecutor에서 동작해요 !

Kafka 컨슈머와 연계된 구조가 아니라서,

메시지 순서가 보장되지 않고 offset commit 타이밍 문제가 생겨서 메시지 유실 가능성이 있어요 ~

스레드 수(concurrency) 설정의 경우 파티션 개수보다 많은 concurrency는 의미가 없어요 ~

일반적으로 CPU 코어 수, 파티션 수, 처리 속도를 고려해서 적절히 조정하시는걸 권장드려요 :)

 

결론적으로 Kafka 메시지를 병렬로 안정적으로 소비하고 싶다면 무조건

@KafkaListener(concurrency = n)을 사용하는 게 맞습니다 !!

@Async는 Kafka 컨슈머에서는 사용하지 않는 게 좋아요 :)

추가로 궁금한 사항 있으시면 언제든 질문 남겨주세요~~

0

수정한 뒤 AI 답변 다시 받고싶어서 글 삭제를 했는데 작성자 삭제가 되었네요...

0

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

Kafka의 소비자 설정과 관련하여 좋은 질문 주셨습니다. @KafkaListenerconcurrency 속성과 @Async를 활용한 스레드 풀 설정은 Kafka 메시지 처리의 병렬성을 높이는 데 사용될 수 있지만, 그 작동 방식에는 차이가 있습니다.

@KafkaListener의 concurrency 속성

  • concurrency 옵션을 사용하면 특정 컨슈머 그룹 내에서 여러 스레드가 동시에 메시지를 처리할 수 있습니다. 이는 Kafka 클러스터의 파티션 수와 밀접하게 연관되는데, 일반적으로 파티션 수 이상으로 설정하는 것은 비효율적입니다.

@Async와 ThreadPool

  • @Async를 통해 스레드 풀을 설정하는 방식은 개별 메시지를 여러 스레드에서 처리하도록 하는 것입니다. 이 방식은 보다 일반적인 비동기 처리에 사용되며, KafkaListener 내에서도 메시지 처리 수행 시 비동기적으로 실행되게 할 수 있습니다.

비교

  • concurrency는 KafkaListener 자체가 여러 파티션을 병렬로 처리하게 하여 자연스럽게 여러 스레드를 활용하나, 이는 컨슈머 그룹 내에서 병렬성을 제어하는 설정입니다.
  • 반면 @Async는 메서드 레벨에서 비동기 처리를 지원하는 방식으로써, 개별 메시지를 처리하는 로직을 병렬로 나누어 실행하는 데 효과적입니다. 두 가지 방식은 서로 다른 계층에서 병렬성을 부여하므로 완전히 동일한 방식으로 동작하지 않습니다. concurrency 설정은 컨슈머 수준의 병렬성을 제공하고, @Async는 개별 메시지 처리의 병렬성을 제공합니다.

이와 관련된 더 깊이 있는 이해를 위해 다음 링크를 참고하시기 바랍니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기