Ответ
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 по умолчанию использует хэш ключа для определения партиции, поэтому сообщения с одинаковым ключом всегда попадают в одну и ту же партицию. - Использовать топик с одной партицией. Это гарантирует глобальный порядок для всех сообщений в топике, но полностью устраняет возможность параллельной обработки и становится узким местом системы.