Conumser의 설정 파리미터 중에서 partition.assingment.strategy로 할당 방식을 조정할 수 있다.
- org.apache.kafka.clients.consumer.RangeAssginor : Topic별로 작동하는 Default Assignor
- org.apache.kafka.clients.consumer.RoundRobinAssignor : Round Robin 방식으로 Consumer에게 Partition을 할당한다.
- org.apache.kafka.clients.consumer.StickyAssginor : 최대한 많은 기존 Partition 할당을 유지하면서 최대 균형을 이루는 할당을 보장한다.
- org.apache.kafka.clients.consumer.CooperativeStickyAssignor : 동일한 StickyAssignor 논리를 따르지만 협력적인 Rebalance를 허용한다.
- org.apache.kafka.clients.consumer.ConsumerPartitionAssginor : 인터페이스를 구현하면 사용자 지정 할당 전략을 사용할 수 있다.
- partition.assignment.strategy 파라미터의 Default Assginor
가정 : Consumer Group안에 Consumer가 3개 있고 이 Consumer 들이 Topic 0과 Topic 1의 Partiton 0,1을 모두 Polling 해서 Consume하고 있다.
- 이 때 Default Assignor는 무조건 0부터 순서대로 할당해준다.
- 동일한 Key를 가지고 있는 메세지들에 대한 Topic 간에 "co-partitioning" 하기에 유리하다.
- ex) Delivery ID를 Key로 가지고 있는 delivery_status 메시지와 delivery_location 메시지
T0-P0 = Consumer 0
T0-P1 = Consumer 1
T0-P2 = Consumer 0
T1-P0 = Consumer 1
T1-P1 = Consumser 0
T1-P2 = Consumer 1
- Reassign(재할당) 후 Consumer가 동일한 Partition을 유지한다는 보장이 없다.
ex) Consumer 0이 지금 Topic0의 Partiton0에 할당되어 있지만 재할당이 발생하면 Topic0의 Partition0이 다른 Consumer에게 할당될 수 있다.
- Consumer간 Subscribe 해오는 Topic이 다른 경우 할당 불균형이 발생할 가능성이 있다.
- 3개의 Consumer C0,1,2와 3개의 Topic T0,1,2,를 가정
- T0은 Partition 1개, T1은 Partition 2개, T2는 Partition 3개를 가정
- C0은 T0만, C1은 T0과T1만, C2는 T0,T1,T2를 Subscribe 한다고 가정
T0-P0 - C0
T1-P0 - C1
T1-P1 - C2
T2-P0 - C2
T2-P1 - C2
T2-P2 - C2
- 가능한한 균형적으로 할당을 보장한다.
- Consumer들에게 할당된 Topic Partition의 수는 최대 1만큼 다르다.
- ConsumerA가 ConsumerB에 비해 2개이상 더 적은 Topic Partition이 할당된 경우, A에 할당된 Topic의 나머지 Partition들은 B에 할당될 수 없다.
- 재할당이 발생했을 때 기존 할당을 최대한 많이 보존하여 유지한다.
- Topic Partition이 하나의 Consumer에서 다른 Consumer로 이동할 때의 오버헤드를 줄인다.
- 3개의 Consumer C0,C1,C2와 4개의 Topic T0,T1,T2,T3를 가정
- T0,T1,T2,T3는 모두 Partition 2개를 가정
- C0,C1,C2 모두 T0,T1,T2,T3를 Subscribe 한다고 가정
- Rounb Robin과 비슷한 과정이다.
- Round Robin은 처음부터 다시 순차적으로 할당한다. : 전체를 다시 재할당
- Sticky Assignor는 C1을 제외한 기존에 할당되었던 형태를 유지하면서 C1에 붙어있는 Topic들만 다시 순차적으로 재할당한다. : 기존 할당을 유지하면서 나머지 부분만 재할당
Round Robin 방식에서 설명했던 할당 불균형이 발생했던 시나리오
- 3개의 Consumer C0,C1,C2와 3개의 Topic T0,T1,T2를 가정
- T0은 Partiton 1개, T1은 Partition 2개, T2는 Partition 3개를 가정
- C0은 T0만, C1은 T0,T1만, C2는 T0,T1,T2를 Subscribe한다고 가정
T0-P0 : C0
T1-P0 : C1
T1-P1 : C1 (C2가 너무 많이 할당되는 것을 방지)
T2-P0: C2
T2-P1: C2
T2-P2: C2
Sticky 방식을 사용하면 재할당 되었을 때 Consumer간 차이가 많이 벌어지지 않도록 Partition의 개수가 더 적은 쪽으로 할당된다.
- org.apache.kafka.clients.consumer.RangeAssignor : Topic 별로 작동하는 Default Assignor
- org.apache.kafka.clients.consumer.RoundRobinAssginor : Round Robin 방식으로 Consumer에게 Partition을 할당한다.
- org.apache.kafka.clients.consumer.StickyAssignor : 최대한 많은 기존 Partition 할당을 유지하면서 최대 균형을 이루는 할당을 보장한다.
안녕하세요 잘봤습니다. 혹시 이미지는 출처가 어떻게 되는지 공유받을 수 있을까요?