Гарантирует ли Kafka порядок чтения сообщений из топика?

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

Ответ

Да, но с критическим условием: Kafka гарантирует строгий порядок сообщений в пределах одной партиции.

Как обеспечить порядок:

  1. Запись: Все сообщения, для которых важен порядок, должны отправляться с одинаковым ключом (key). Одинаковый ключ гарантирует попадание всех сообщений в одну и ту же партицию.
  2. Чтение: Чтение должно осуществляться одним консьюмером (или одной консьюмер-группой) с этой партиции.

Пример для Producer:

// Все сообщения с ключом "user-123" попадут в одну партицию
ProducerRecord<String, String> record1 = new ProducerRecord<>("orders", "user-123", "Order Created");
ProducerRecord<String, String> record2 = new ProducerRecord<>("orders", "user-123", "Order Paid");
producer.send(record1);
producer.send(record2); // Гарантированно будет после record1 в одной партиции.

Важные ограничения:

  • Между разными партициями порядок не гарантируется. Сообщения A1 (в партиции 0) и B1 (в партиции 1) могут быть доставлены консьюмеру как B1, A1.
  • Использование одной партиции для всех сообщений создаёт bottleneck. Компромисс: определять ключ так, чтобы логически связанные сообщения (например, события по одному пользователю или заказу) попадали в одну партицию, а несвязанные — распределялись по другим.