Вопрос проверяет понимание модели доставки сообщений в Kafka и того, где именно гарантируется порядок.
Kafka гарантирует порядок сообщений внутри одной партиции: если два сообщения попали в одну и ту же партицию, потребитель увидит их в том же порядке. Если сообщения распределены по разным партициям, общего порядка между ними нет. Обычно порядок “по сущности” (например, по пользователю) обеспечивают тем, что у сообщений одинаковый ключ, чтобы они попадали в одну партицию. Также важно, что порядок может “сломаться” на уровне обработки, если обрабатывать сообщения параллельно без контроля.
Kafka не пытается дать “глобальный порядок” для всего топика. Вместо этого она делает порядок простым и надёжным там, где это реально обеспечить.
Партиция — это упорядоченная последовательность сообщений внутри топика, где каждое новое сообщение добавляется в конец и получает смещение (offset).
Внутри одной партиции
Сообщения записываются последовательно.
Потребитель читает их по offset: 0, 1, 2, 3...
Поэтому порядок “как записали, так и прочитали” сохраняется.
Между партициями порядок не гарантируется
Если у топика 10 партиций, то события могут идти параллельно.
Сообщение из партиции 3 может быть обработано раньше сообщения из партиции 7, даже если “по времени” оно было отправлено позже.
Если важно, чтобы события одной сущности шли строго по порядку (например, все события пользователя), делают так:
key = user_id
Kafka будет стабильно отправлять все сообщения с одним ключом в одну и ту же партицию (при неизменном числе партиций и стратегии партиционирования).
Пример (идея на уровне клиента-производителя):
producer.send(
topic="user-events",
key=str(user_id).encode(),
value=payload_bytes,
)
Даже если Kafka отдаёт сообщения по порядку, потребитель может “перепутать” порядок, если:
читает пачку сообщений,
запускает обработку параллельно,
подтверждает (commit) смещения неаккуратно.
Практичные подходы:
Обрабатывать последовательно внутри одной партиции.
Если нужен параллелизм, делать его “по ключу”, но так, чтобы для одного ключа обработка была последовательной.
В одной consumer group одна партиция назначается только одному потребителю.
Это помогает сохранить порядок обработки внутри партиции (нет конкуренции двух потребителей за одну партицию).
Но при ребалансировках (перераспределении партиций) нужно аккуратно работать с commit’ами.
Порядок в Kafka гарантируется на уровне партиции, поэтому порядок по конкретной сущности обычно обеспечивают ключом, чтобы все её события попадали в одну партицию.