강의

멘토링

로드맵

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

writer0713님의 프로필 이미지
writer0713

작성한 질문수

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

[실습] Spring Boot에서 하나의 컨슈머로 메시지 병렬적으로 처리하기

concurrency 동작 안됨

작성

·

16

0

하나의 consumer 에서 concurrency 옵션을 통해 멀티 쓰레드로 동작이 되는지 테스트를 해봤는데 강좌화면에서처럼 consumer 가 멀티스레드로 동작하지 않는것 같습니다.

 

  • partition : 3개

  • concurrency : 3

  • partitional.class: org.apache.kafka.clients.producer.RoundRobinPartitional

 

로그 :

로그를 봐서는 roundrobin 으로 설정을 했음에도 하나의 partition 으로 메시지가 들어가는것 같습니다. 그리고, consumer 도 하나의 스레드로 message 를 consume 하는것으로 보입니다.

2025-10-15T16:01:15.466+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.OrderService   : Received message {"name":"Product-4","price":4000}
2025-10-15T16:01:17.473+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.Refresher      : Done processing order..
2025-10-15T16:01:17.474+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.OrderService   : Received message {"name":"Product-8","price":8000}
2025-10-15T16:01:19.480+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.Refresher      : Done processing order..
2025-10-15T16:01:19.481+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.OrderService   : Received message {"name":"Product-16","price":16000}
2025-10-15T16:01:21.485+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.Refresher      : Done processing order..
2025-10-15T16:01:21.486+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.OrderService   : Received message {"name":"Product-15","price":15000}
2025-10-15T16:01:23.491+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.Refresher      : Done processing order..
2025-10-15T16:01:23.491+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.OrderService   : Received message {"name":"Product-5","price":5000}
2025-10-15T16:01:25.494+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.Refresher      : Done processing order..
2025-10-15T16:01:25.495+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.OrderService   : Received message {"name":"Product-18","price":18000}
2025-10-15T16:01:27.499+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.Refresher      : Done processing order..
2025-10-15T16:01:27.501+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.OrderService   : Received message {"name":"Product-3","price":3000}
2025-10-15T16:01:29.510+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.Refresher      : Done processing order..
2025-10-15T16:01:29.510+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.OrderService   : Received message {"name":"Product-9","price":9000}
2025-10-15T16:01:31.514+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.Refresher      : Done processing order..
2025-10-15T16:01:31.515+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.OrderService   : Received message {"name":"Product-13","price":13000}
2025-10-15T16:01:33.522+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.Refresher      : Done processing order..
2025-10-15T16:01:33.522+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.OrderService   : Received message {"name":"Product-1","price":1000}
2025-10-15T16:01:35.527+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.Refresher      : Done processing order..
2025-10-15T16:01:35.529+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.OrderService   : Received message {"name":"Product-11","price":11000}
2025-10-15T16:01:37.532+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.Refresher      : Done processing order..
2025-10-15T16:01:37.532+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.OrderService   : Received message {"name":"Product-19","price":19000}
2025-10-15T16:01:39.538+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.Refresher      : Done processing order..
2025-10-15T16:01:39.538+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.OrderService   : Received message {"name":"Product-7","price":7000}
2025-10-15T16:01:41.539+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.Refresher      : Done processing order..
2025-10-15T16:01:41.539+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.OrderService   : Received message {"name":"Product-6","price":6000}
2025-10-15T16:01:43.543+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.Refresher      : Done processing order..
2025-10-15T16:01:43.544+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.OrderService   : Received message {"name":"Product-20","price":20000}
2025-10-15T16:01:45.554+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.Refresher      : Done processing order..
2025-10-15T16:01:45.555+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.OrderService   : Received message {"name":"Product-10","price":10000}
2025-10-15T16:01:47.560+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.Refresher      : Done processing order..
2025-10-15T16:01:47.560+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.OrderService   : Received message {"name":"Product-14","price":14000}
2025-10-15T16:01:49.566+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.Refresher      : Done processing order..
2025-10-15T16:01:49.566+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.OrderService   : Received message {"name":"Product-17","price":17000}
2025-10-15T16:01:51.568+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.Refresher      : Done processing order..
2025-10-15T16:01:51.568+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.OrderService   : Received message {"name":"Product-2","price":2000}
2025-10-15T16:01:53.575+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.Refresher      : Done processing order..
2025-10-15T16:01:53.577+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.OrderService   : Received message {"name":"Product-12","price":12000}
2025-10-15T16:01:55.581+09:00  INFO 11736 --- [kafka-practice] [ntainer#0-2-C-1] c.w.kafkapractice.service.Refresher      : Done processing order..

 

github 소스코드 : https://github.com/writer0713/kafka-practice/blob/4cee9e560b2459c4bcbb6b183f3791d70cddd3d1/src/main/kotlin/com/writer0713/kafkapractice/service/OrderService.kt#L34

답변 2

0

writer0713님의 프로필 이미지
writer0713
질문자

자문자답입니다.. ^^;;

yaml 에서 partitioner 설정에 오타가 있었네요.. RoundRobinPartitional 라고 적어서 제대로 동작하지 않은것 같습니다 ㅜㅜ

 

한참 삽질하다가 kotlin code 로 설정을 다시해보니 잘 되어서 하나씩 비교해보니 partitioner 인데 partitional 로 잘못 썼었습니다.

0

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

Kafka Consumer에서 concurrency 옵션을 사용하여 멀티스레드로 동작하려 할 때, 설정이 기대한 대로 작동하지 않을 경우 몇 가지 확인 사항이 있습니다.

주요 체크 포인트:

  1. RoundRobin 배치 확인:
    org.apache.kafka.clients.producer.RoundRobinPartitional 설정은 프로듀서가 메시지를 각 파티션에 라운드 로빈 방식으로 분배하도록 설정합니다. 만약 모든 메시지가 특정한 파티션에만 들어간다면, 프로듀서 설정이 올바르게 적용되었는지 확인이 필요합니다. 프로듀서 측 설정이 잘못될 경우 메시지 분산이 제대로 이루어지지 않을 수 있습니다.

  2. consumer 수와 파티션의 관계:

    • 설정한 concurrency 값과 파티션 수가 같다면, 각각의 스레드가 서로 다른 파티션을 처리할 수 있도록 설정이 되어 있어야 합니다. 하지만 로그를 보면 하나의 스레드만 메시지를 받아들이고 있는 것처럼 보입니다.
  3. Group ID 설정:

    • 그룹 ID가 동일한 경우, 여러 인스턴스 또는 스레드가 동일한 파티션의 메시지를 무조건 순차적으로 처리하게 됩니다. 각 스레드는 서로 다른 파티션을 할당받게 되므로, 각 파티션으로의 메시지 전달이 명확한지 확인하세요.
  4. Kafka 설정 및 로그 확인:

    • Kafka 설정 파일과 로그를 확인하여 설정이 제대로 반영되었는지 디버깅하는 것이 중요합니다. 필요한 경우, 로그 레벨을 높여 추가 디테일을 볼 수 있습니다.
  5. 조정사항:

    • 이상 상황을 확인하려면 일단 메시지가 모두 같은 파티션으로 전송되고 있는지, 그리고 컨슈머가 제대로 스레드를 활용하고 있는지를 확인해야 합니다.
    • 만약 메시지가 한 파티션에 쏠려 있다면, 프로듀서 설정을 점검하고, 메시지 키가 잘못 설정되어 있는지도 확인해보세요.

추가 자료:

아래 유사한 질문과 답변 링크를 참고하여 추가적인 조언을 얻으실 수 있을 것입니다:

이 정보가 문제 해결에 도움되기를 바라며, 기타 궁금한 점이나 추가적인 도움이 필요하시면 질문 남겨 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

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

writer0713님의 프로필 이미지
writer0713

작성한 질문수

질문하기