Важно помнить, что гарантия заказа действует только для сообщений, отправленных одним и тем же производителем.Там нет гарантии заказа для сообщений, которые отправляются разными производителями.В этом сценарии единственное, что имеет значение, это порядок приема со стороны брокера.Если вам нужна такая функциональность, она должна быть включена в сам код производителя.Вы можете найти более подробную информацию в этом блоге .
. В случае, если вы хотите поддерживать порядок даже в случае сбоя со стороны производителя, это может иметь отношение:
Если для параметра retries задано ненулевое значение, а для max.in.flights.requests.per.session более одного означает, что возможно, что посреднику не удастся записать первый пакет сообщений, успешнозаписать вторую (которая уже находилась в полете), а затем повторить попытку первой партии и выполнить ее, тем самым изменив порядок.
Обычно установка числа повторных попыток в ноль не является надежной системой, поэтому если гарантированный порядок важен, мы рекомендуем установить in.flight.requests.per.session = 1, чтобы убедиться, что покапакет сообщений повторяется, дополнительные сообщения не будут отправлены (потому что это может изменить правильный порядок).Это сильно ограничит пропускную способность производителя, поэтому используйте его только тогда, когда важен порядок.
from: Руководство по Kafka
UPDATE-1
Итак, я немного покопался в исходном коде производителя Kafka.Очевидно, производитель добавляет записи в запись аккумулятор и затем отправляет все записи в аккумуляторе посреднику (ам) после того, как партия заполнена или прошло достаточно много времени.С каждой записью связана временная метка.Я думаю, что брокер (-ы) добавляют записи в порядке метки времени к теме и, следовательно, обеспечивают поддержание порядка в пределах раздела.Кто-то, кто лучше знает внутренности Кафки, может согласиться с тем, чтобы отвергнуть эту гипотезу.
UPDATE-2
Как указано cricket_007 в комментариях, порядок элементов, выбираемых из аккумулятора, не зависит отметка времени.Аккумулятор является очередью, поэтому порядок вставки и извлечения одинаков.