Как Kafka распределит сообщения из двух партиций на один consumer в группе

Ответ

Если в consumer group находится только один consumer, он будет получать сообщения из всех партиций топика, на который он подписан. В данном случае — из обеих.

Kafka гарантирует, что каждая партиция будет назначена ровно одному consumer в рамках одной группы. Поскольку consumer всего один, Kafka назначает ему все доступные партиции для обработки.

Ключевые моменты:

  1. Порядок сообщений: Порядок доставки сообщений гарантируется только в пределах одной партиции. Consumer будет получать сообщения из двух партиций вперемешку, но внутри каждой из них порядок будет сохранен.
  2. Масштабирование: Если добавить в ту же consumer group второго consumer, Kafka автоматически запустит процесс ребалансировки. В результате каждая партиция будет назначена одному из consumer (например, consumer-1 получит partition-0, а consumer-2partition-1).
  3. Производительность: Один consumer может стать «узким местом» (bottleneck), если он не успевает обрабатывать суммарный поток данных из всех назначенных ему партиций.

Пример кода на Python (kafka-python):

from kafka import KafkaConsumer

# Этот consumer подпишется на обе партиции топика 'my-topic'
consumer = KafkaConsumer(
    'my-topic',
    bootstrap_servers='localhost:9092',
    group_id='my-single-consumer-group'
)

for message in consumer:
    # В выводе будут сообщения из partition 0 и 1
    print(f"Partition: {message.partition}, Offset: {message.offset}, Value: {message.value.decode('utf-8')}")