Ответ
Apache Kafka гарантирует упорядоченную доставку сообщений только в пределах одного раздела (партиции) топика. Сообщения в партиции хранятся и читаются в порядке их отправки (FIFO).
Ключевые условия:
- Один производитель (producer) → одна партиция: Сообщения с одинаковым ключом (key) попадают в одну и ту же партицию, что гарантирует их порядок.
- Один потребитель (consumer) → одна партиция: Для сохранения порядка на стороне чтения, одна партиция должна обрабатываться одним потребителем в рамках consumer group.
Пример, демонстрирующий порядок:
// Producer отправляет сообщения с одинаковым ключом
ProducerRecord<String, String> record1 = new ProducerRecord<>("my-topic", "user-123", "Event A");
ProducerRecord<String, String> record2 = new ProducerRecord<>("my-topic", "user-123", "Event B");
// Оба сообщения попадут в одну партицию. Consumer получит сначала "Event A", затем "Event B".
Пример, где порядок НЕ гарантирован:
// Сообщения с разными ключами могут попасть в разные партиции
producer.send(new ProducerRecord<>("my-topic", "user-123", "Event A"));
producer.send(new ProducerRecord<>("my-topic", "user-456", "Event B"));
// Порядок обработки "Event A" и "Event B" потребителями не определен.
Почему это важно? Для реализации строгой очередности событий (например, для конкретного пользователя) необходимо правильно выбирать ключ сообщения, чтобы все связанные события отправлялись в одну партицию.