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

김지수님의 프로필 이미지
김지수

작성한 질문수

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

Apache Kafka 사용 - Producer/Consumer

k8s환경에서 Pod 수에 따른 컨슈머 인스턴스 개수가 궁금합니다.

작성

·

281

·

수정됨

0

spring kafak consumer의 경우

@Component
public class KafkaConsumer {

    @KafkaListener(topics = "myTopic", groupId = "myGroup")
    public void listen1(String message) {
        System.out.println("Listener 1 - Received message: " + message);
    }

위와 같은 로직에서 @KafkaListener에 따라서 컨슈머 인스턴스가 생성된다고 파악했는데,

 

스프링 어플리케이션과 카프카 컨슈머 인스턴스의 상관관계에 있어 질문이 있습니다.

 

  1. k8s환경에서 5개의 pod로 애플리케이션이 실행될 경우 컨슈머 인스턴스가 5개 생성 되는걸까요?

    그렇다면 Pod의 개수에 맞춰서 파티션 개수를 조절해야하는지, 파티션의 개수가 pod의 개수보다 적다면 할당되지 않은 리스너는 컨슈밍하지 않는지 궁금합니다.

 

 

  1. 스프링 어플리케이션 = 카프카 컨슈머 인스턴스 인가요?

    1. 아래 처럼 코드를 작성하면 컨슈머 인스턴스가 몇개 띄워지는지 궁금합니다

@Component
public class KafkaConsumer {

    @KafkaListener(topics = "myTopic", groupId = "myGroup")
    public void listen1(String message) {
        System.out.println("Listener 1 - Received message: " + message);
    }

    @KafkaListener(topics = "myTopic", groupId = "myGroup")
    public void listen2(String message) {
        System.out.println("Listener 1 - Received message: " + message);
    }

답변 2

0

Dowon Lee님의 프로필 이미지
Dowon Lee
지식공유자

안녕하세요, 이도원입니다.

질문하신 내용 중 @KafkaListener당 하나의 Consumer instance가 생성되는 것으로 알고 있습니다. 따라서 POD의 개수에 맞춰 Consumer instance가 실행됩니다. 메시징 처리를 효율적으로 하기 위해서 Kafka의 파티션 당 하나의 Consumer instance를 사용하는 게 좋을 것 같으며, Consumer instance의 개수가 파티션보다 적으면 연결되지 않은 파티션이 생길 수 있을 것 같습니다. 물론 해당 파티션에만 저장 된 메시지는 없다고 보여지지만, 그대로 병렬처리가 되어야 하는 상황에서는 운영 중인 시스템을 확인해 보면서 설정을 조절해야 할 것 같습니다. 두번째 질문은 Consumer instance의 개수가 놓고 보면, 2개의 인스턴스가 실행되겠지만, 같은 groupID이기 때문에, 동일한 파티션에 할당 될 것 같습니다. (아래 AI 답변의 내용에 동의합니다)

감사합니다.

 

0

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

  1. k8s환경에서 5개의 pod로 애플리케이션이 실행될 경우, 각 pod는 독립적인 스프링 어플리케이션 인스턴스입니다. 따라서 groupId가 같은 @KafkaListener가 각 pod 내에 존재한다면, 기본적으로 각 pod당 하나의 컨슈머 인스턴스가 생성되어 총 5개의 컨슈머 인스턴스가 생성됩니다. 그리고 파티션의 개수가 컨슈머 인스턴스 수보다 적을 경우, 일부 컨슈머는 파티션을 할당받지 못하고 대기 상태가 됩니다. 이때는 파티션의 개수를 적절히 조절하여 각 컨슈머가 효율적으로 작동하도록 설정하는 것이 좋습니다.

  2. 스프링 어플리케이션의 인스턴스와 카프카 컨슈머 인스턴스는 무조건적으로 동일하지 않습니다. @KafkaListener 어노테이션을 사용하면 해당 리스너에 대한 컨슈머 인스턴스가 생성되므로, 하나의 스프링 어플리케이션에서 여러 개의 @KafkaListener를 정의하면 각 리스너마다 컨슈머 인스턴스가 생성됩니다. 예를 들어, 주어진 코드 예제와 같이 ‘myTopic’에 대해 ‘myGroup’ 그룹 아이디를 가진 @KafkaListener가 두 개 정의되어 있으면, 동일한 토픽을 듣고 있는 두 개의 독립적인 컨슈머 인스턴스가 생성됩니다. 그러나 같은 groupId를 공유한다면 Kafka의 컨슈머 그룹 내에서는 이 두 리스너가 한 컨슈머 그룹으로 간주되어 파티션 할당에 영향을 줄 수 있습니다.

님의 질문에 도움이 되었길 바랍니다. 추가적인 도움이 필요하시면 언제든 문의해주세요.

김지수님의 프로필 이미지
김지수

작성한 질문수

질문하기