Ответ
Нет, глобальный порядок не гарантируется. В Kafka порядок сообщений гарантируется только в пределах одной партиции. Если топик распределен по нескольким партициям, потребители, читающие из разных партиций параллельно, будут получать сообщения в непредсказуемом порядке относительно друг друга.
Как обеспечить упорядоченную обработку?
-
Использование ключа сообщения (Key): Все сообщения с одинаковым ключом попадут в одну и ту же партицию, сохраняя порядок для этой логической группы.
// Сообщения с ключом "user123" будут строго упорядочены producer.send(new ProducerRecord<>("orders", "user123", "Order1")); producer.send(new ProducerRecord<>("orders", "user123", "Order2")); -
Топик с одной партицией: Гарантирует глобальный порядок, но серьезно ограничивает пропускную способность и параллелизм.
-
Использование Kafka Streams: Библиотека
Kafka Streamsпредоставляет примитивы для stateful-обработки (например, агрегации в окнах) с гарантией порядка в рамках ключа.
Практический вывод: Проектируйте приложение так, чтобы порядок был важен только в контексте конкретного ключа (например, ID пользователя, ID заказа). Для сквозного порядка требуется сложная координация на уровне приложения, что противоречит распределенной природе Kafka.