카프카/Java 기반 카프카 클라이언트 구현, Consumer 내부 메커니즘 2

Consumer의 Static Group Membership

webmaster 2025. 10. 18. 14:08
728x90

필요성

  • 많은 Consumer를 가지는 Consumer Group에서 Rebalance가 발생하면 모든 Consumer들이 Rebalance를 수행하므로 많은 시간이 소모되고, 대량 데이터 처리 시 Lag가 더 길어질 수 있다.
  • 유지보수 차원의 Consumer Restart도 Rebalance를 초래하므로 불필요한 Rebalance를 발생시키지 않을 방법을 대두.

Static Group Membership

Static Group Membership

  • Consumer Group내의 Consumer들에게 고정된 ID를 부여
  • Consumer 별로 Consumer Group 최초 조인 시 할당된 파티션을 그대로 유지하고, Consumer가 shutdown 되더라도 session.timeout.ms 내에 재기동되면, Rebalance가 수행되지 않고 기존 파티션이 재할당된다.
  • 동작 과정
    • Consumer#3 가 종료되었지만 Rebalance가 일어나지 않으며, Partition#3는 다른 Consumer에 재할당되지 않고 읽혀지지 않는다.
    • Consumer#3가 session.timeout.ms 내에 다시 재기동되면, Partition#3는 Consumer#3에 할당
    • Consumer#3가 session.timeout.ms내에 기동되지 않으면 Rebalance가 수행된 후 Partition#3가 다른 Consumer에 할당된다.
    • Static Group Membership을 적용할 경우 session.timeout.ms를 좀 더 큰 값으로 설정해야 한다.

실습

1. Pizza Producer 기동

2. Consummer 기동(Static Group Membership)

Properties props = new Properties();
props.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.56.101:9092");
props.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
props.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
props.setProperty(ConsumerConfig.GROUP_ID_CONFIG, "group-01-static");
props.setProperty(ConsumerConfig.GROUP_INSTANCE_ID_CONFIG, "3"); //Static Group Membership
  • 실행할 때마다, 매번 GroupInstanceIdConfig 값을 1 -> 2 -> 3으로 변경(고정값)해서 실행시켜 준다.

3. Partition이 고정적으로 할당되는지 확인

kafka-consumer-groups --bootstrap-server localhost:9092 --describe --group group-01-static

결과

4. Consumer#3 번 종료

종료 시, 바로 Rebalance가 되지 않는다. Consumer에 기본적으로 세팅된 session.timeout.ms(45,000) 이후 Rebalance 된다.

session.timeout.ms 내에 재기동

  • session.timeout.ms 이내 재기동했기 때문에 Rebalance 되질 않는다.

session.timeout.ms 이후에 재기동
Partition 상태 보기

  • session.timeout.ms 이 후 재기동 했기 때문에 Rebalance 된다.
728x90