Ответ
Да, но с критическим условием: Kafka гарантирует строгий порядок сообщений в пределах одной партиции.
Как обеспечить порядок:
- Запись: Все сообщения, для которых важен порядок, должны отправляться с одинаковым ключом (key). Одинаковый ключ гарантирует попадание всех сообщений в одну и ту же партицию.
- Чтение: Чтение должно осуществляться одним консьюмером (или одной консьюмер-группой) с этой партиции.
Пример для 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. Компромисс: определять ключ так, чтобы логически связанные сообщения (например, события по одному пользователю или заказу) попадали в одну партицию, а несвязанные — распределялись по другим.