Потребление сообщений Apache Kafka, когда количество перегородок превышает число потребителей

Если я запускаю кластер Kafka с большим количеством разделов, чем у моей одинокой группы потребителей есть потребители. Существуют ли какие-либо гарантии при заказе сообщений или своевременная доставка сообщений через разделы?

Простой пример:
2 раздела, 1 Потребительский сектор Производители контролируют назначение раздела с помощью ключа.
Сообщение 1 приходит и переходит в раздел A
Сообщение 2 приходит и переходит в раздел B
Сообщение 3 входит и переходит в раздел A

Я знаю, что сообщение 1 будет потребляться до сообщения 3, потому что они находятся в одном разделе. Но как насчет сообщения 2? Будет ли он потребляться до сообщения 3 или после? Или это может измениться? Может ли оно быть использовано до сообщения 1?

Кроме того, что, если новые сообщения продолжают поступать в раздел A, а производство быстрее, чем потребление? Будет ли сообщение 2 сидеть в разделе B бесконечно? Когда это будет потреблено? Есть ли гарантии, что сообщения не будут сидеть там навсегда?

В более общем плане: Если потребитель назначается нескольким разделам, как и когда этот потребитель обменивается между этими разделами?

Ответ 1

Гарантийные гарантии

Kafka обеспечивает гарантии заказа только внутри раздела. В вашем примере сообщение 2 может быть использовано до сообщения 1, после сообщения 1 или после сообщения 3. Это зависит только от производительности потребителя. Дополнительная информация об этом доступна в документации: https://kafka.apache.org/documentation.html#introduction (темы "Потребители" и "Гарантии" ).

Медленное потребление

Брокер Kafka не осведомлен о потребителях. Он сохраняет сообщения в сегментах журнала, пока соответствующий сегмент журнала не будет удален. Потребители могут в любой момент подключиться к брокеру и начать потребление из самого старого сегмента журнала. Минимальное время хранения сообщения контролируется двумя конфигурационными свойствами: log.retention.hours и log.retention.bytes (с возможными переопределениями для каждой темы). Подробнее об этом в документации: https://kafka.apache.org/documentation.html#brokerconfigs.

Отвечая на ваш вопрос: если потребитель в конечном итоге становится медленнее, чем производитель, у него есть время, чтобы догнать (1 неделя по умолчанию). Если это не так, некоторые неиспользуемые сообщения будут удалены навсегда.

Использование нескольких разделов

Пользователь высокого уровня создает несколько объектов KafkaStream, каждый из которых предоставляет данные из одного или нескольких разделов. Это зависит от вас, как потреблять эти потоки: в отдельных потоках, циклическом и т.д. Также можно извлекать временные метки сообщений и объединять потоки в один поток, восстанавливающий порядок сообщений.