[통신] Kafka 컨슈머와 컨슈머 그룹

2025. 2. 18. 13:45카테고리 없음

 

MSA설계 및 구현을 위해 consumer를 하나의 서비스로 이해하면서 사용하던 중 의문이 생겼다. 

consumer가 Topic의 partition을 부분적으로 subscribe하고 있다면, 나머지 데이터 처리에 누락이 생기는 것 아닐까? 

 

예를 들면, 아래와 같이 Consumer1, Consumer2가 각각 Topic-user를 구독하며 Partition1,2 와 Partition3,4에서 데이터를 pull 하여 처리한다고 했을때  Consumer1이라는 서비스는 Partition3,4에 대한 데이터를 처리할 수 없는 것 아닌가? 라는 의문이 들었다. 

 

이러한 의문은 컨슈머 그룹 내에서의 데이터 할당 방식을 제대로 이해하지 못했기 때문이었다. 

Consumer Group을 이해하면서 kafka의 데이터 병렬처리를 그제서야 제대로 이해할 수 있었다. 

 

Consumer 그룹 내에서의 데이터 할당 방식 

Kafka에서는 하나의 컨규머 그룹 내의 컨슈머들이 모든 데이터를 나눠서 처리하도록 설계되어 있다. 

즉, 각 컨슈머가 '하나의 파티션'만 읽는 것이 아니라, '컨슈머 그룹 전체가 토픽의 모든 데이터를 소비할 수 있도록 파티션을 나누는 것'이 핵심인 것이다. 

  • 각 컨슈머 그룹 내 컨슈머들은 파티션을 나누어서 소비하지만, 결과적으로 모든 파티션읠 데이터는 그룹 내 컨슈머들이 전부 읽게 된다. 
  • 한 개의 파티션은 오직 한개의 컨슈머만 소비 가능하지만, 반대로 여러 파티션을 하나의 컨슈머가 소비하는 것이 가능하다. 

즉, 컨슈머 그룹 전체를 기준으로 보면 토픽 내 모든 파티션의 데이터가 빠짐 없이 소비된다. 

Consumer Group -1 의 consumer1은 Partition1, Partition2를 소비하고 consumer2은 Partition3, Partition4를 소비한다. 

컨슈머 그룹 전체로 보면 모든 파티션의 데이터를 빠짐 없이 처리한다. 

 

따라서 컨슈머 수가 파티션의 갯수보다 많은 것은 의미가 없다. parition은 하나의 동일 그룹내의 하나의 consumer만 처리하는 것이 가능하기 때문에 나머지 할당할 파티션이 없어서 컨슈머는 대기 상태가 되기 때문이다. 

 

컨슈머 그룹을 여러개 만들면 어떻게 될까?

각자 다른 컨슈머 그룹이 동일한 토픽을 구독할 수 있다.

Consumer Group-2에 속한 컨슈머들도 각각의 파티션에서 데이터를 가져갈 수 있다. 

즉, 컨슈머 그룹은 기존 컨슈머 그룹과 독립적으로 데이터를 읽을 수 있다. 데이터 소비 방식도 독립적으로 작동한다. 

 

컨슈머 그룹은 서로 다른 서비스 로직을 가지고 있으며 , 동일한 데이터를 이용할 뿐이라고 이해하면 된다. 

예를 들면 Consumer Group-1은 user 토픽의 데이터를 실시간 로그를 저장하는데 사용하고,  Consumer Group-2는 유저 정보를 저장하는 로직을 수행할 수도 있는 것이다. 

 

즉, 각 컨슈머 그룹을 다르게 설정하면, 동일한 데이터를 여러 서비스에서 독립적으로 처리할 수 있다. 

 

컨슈머 그룹을 서비스 단위로 운영할 때의 장점

  • 확장성 
    • 서비스 부하가 증가하면 컨슈머 그룹 내 컨슈머 갯수를 늘려서 병렬처리할 수 있다. 
    • 컨슈머 수 <=  파티션 수일 때만 효과가 있다. 
  • 장애 복구 
    • 특정 컨슈머가 다운되면 Kafka가 자동으로 다른 컨슈머에게 해당 파티션을 재할당한다. 
    • 서비스가 자동으로 복구되므로 안정성이 높아진다. 
  • 독립적인 서비스 운영 가능 
    • 서로 다른 컨슈머 그룹을 만들면 같은 데이터를 여러 서비스에서 독립적으로 처리할 수 있다. 

 

결론

✔️ 컨슈머 그룹을 하나의 서비스로 이해할 수 있다.

✔️ 컨슈머 그룹 내 컨슈머들은 병렬로 작업을 분담하며 같은 서비스를 실행하는 워커(worker)라고 볼 수 있다. 

✔️ 컨슈머 그룹을 다르게 설정하면, 같은 데이터를 활용하는 여러개의 독립적인 서비스를 만들 수 있다. 

✔️ 컨슈머 수를 조절해서 서비스 성능을 확장(Scale-out)할 수 있다. 단, 컨슈머 수를 줄이는 것은 불가능하다.