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

«Как Kafka гарантирует порядок доставки сообщений» — вопрос из категории Брокеры сообщений, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Kafka гарантирует строгий порядок сообщений только в пределах одной партиции (partition).

Каждое сообщение в партиции получает уникальный, монотонно возрастающий порядковый номер — offset. Консьюмеры читают сообщения из партиции последовательно в соответствии с этим offset.

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

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

from kafka import KafkaProducer

producer = KafkaProducer(bootstrap_servers='localhost:9092')

# Сообщения с одинаковым ключом попадут в одну и ту же партицию,
# их порядок будет сохранен.
producer.send('my-topic', key=b'user-123', value=b'event-1')
producer.send('my-topic', key=b'user-123', value=b'event-2')

# Сообщения с разными ключами могут попасть в разные партиции,
# порядок между ними не гарантирован.
producer.send('my-topic', key=b'order-abc', value=b'created')
producer.send('my-topic', key=b'order-xyz', value=b'shipped')

producer.flush()

Как обеспечить строгий порядок?

  • Использовать один и тот же ключ (key) для всех сообщений, которые должны быть обработаны последовательно. Kafka по умолчанию использует хэш ключа для определения партиции, поэтому сообщения с одинаковым ключом всегда попадают в одну и ту же партицию.
  • Использовать топик с одной партицией. Это гарантирует глобальный порядок для всех сообщений в топике, но полностью устраняет возможность параллельной обработки и становится узким местом системы.