Этот вопрос проверяет понимание гарантий порядка доставки сообщений в Apache Kafka, что важно для проектирования надежных потоковых систем.
Apache Kafka — это распределенная система потоковой передачи событий, где данные организованы в топики. Каждый топик делится на разделы (partitions), которые распределяются по серверам кластера для масштабирования и параллельной обработки.
Kafka гарантирует, что сообщения, записанные в один раздел, сохраняют порядок их отправки продюсером. Это достигается тем, что раздел представляет собой упорядоченную, неизменяемую последовательность записей. Консьюмеры читают сообщения из раздела строго в этом порядке.
Поскольку разделы обрабатываются независимо, не существует глобального порядка для всего топика. Сообщение, отправленное в раздел 0, и сообщение, отправленное почти одновременно в раздел 1, могут быть доставлены консьюмерам в произвольном порядке относительно друг друга.
Для приложений, где важен порядок связанных событий (например, обновлений состояния одного пользователя), используют ключ сообщения (message key). Kafka направляет все сообщения с одинаковым ключом (на основе хеширования) в один и тот же раздел, тем самым сохраняя их порядок.
// Пример отправки сообщения с ключом в Kafka (Java API)
ProducerRecord record = new ProducerRecord<>("user-events", userId, eventData);
producer.send(record);
// Все события для данного userId попадут в один раздел и сохранят порядок.Используйте топик с одним разделом, если требуется абсолютный порядок всех сообщений, но это ограничит пропускную способность. Для масштабируемых систем применяйте ключи сообщений, чтобы гарантировать порядок для логически связанных групп событий в пределах одного раздела.