Согласно документации Apache Kafka, порядок сообщений может быть достигнут в разделе или одном разделе в теме. В этом случае, что мы получаем parallelism, и это эквивалентно традиционным MQ, не так ли?
Порядок сообщений Apache Kafka с несколькими разделами
Ответ 1
В Кафке parallelism равно количеству разделов для темы.
Например, предположим, что ваши сообщения разбиты на разделы на user_id и рассмотрят 4 сообщения с идентификаторами пользователя 1, 2, 3 и 4. Предположим, что у вас есть тема "пользователей" с 4 разделами.
Поскольку разбиение на разделы основано на user_id, предположим, что сообщение, имеющее user_id 1, перейдет в раздел 1, сообщение, в котором user_id 2 перейдет на раздел 2 и т.д.
Также предположим, что у вас есть 4 потребителя для этой темы. Поскольку у вас есть 4 потребителя, Kafka назначит каждого потребителя на один раздел. Таким образом, в этом случае, как только 4 сообщения будут нажаты, они немедленно будут потребляться потребителями.
Если у вас было 2 потребителя для темы вместо 4, то каждый потребитель будет обрабатывать 2 раздела, а потребляемая пропускная способность будет почти наполовину.
Чтобы полностью ответить на ваш вопрос, Kafka предоставляет только общий порядок над сообщениями внутри раздела, а не между различными разделами в теме.
т.е. если потребление очень медленное в разделе 2 и очень быстро в части иона 4, сообщение с user_id 4 будет потребляться до сообщения с user_id 2. Именно так разработан Kafka.
Ответ 2
Я решил переместить свой комментарий в отдельный ответ, так как я думаю, что имеет смысл это сделать.
В то время как Джон на 100% прав, о том, что он написал, вы можете подумать о переосмыслении своей проблемы. Вам действительно нужны ВСЕ сообщения, чтобы оставаться в порядке? Или вам нужны все сообщения для определенного user_id (или что-то еще), чтобы оставаться в порядке?
Если первое, то вам нечего делать, вы должны использовать 1 раздел и потерять все возможности parallelism.
Но если во втором случае вы можете разделить ваши сообщения на какой-то ключ, и поэтому все сообщения для этого ключа поступят в один раздел (они могут перейти на другой раздел, если вы измените размер темы, но это другой случай) и таким образом, гарантирует, что все сообщения для этого ключа в порядке.
Ответ 3
В kafka Сообщения с помощью того же ключа, от того же Продюсера, доставляются потребителю в порядке
еще одна вещь: Данные внутри раздела будут храниться в том порядке, в котором они записаны, поэтому данные, считанные из раздела, будут прочитаны для этого раздела
Итак, если вы хотите, чтобы ваши сообщения упорядочивались по нескольким разделам, вам действительно нужно сгруппировать свои сообщения с помощью ключа, чтобы сообщения с одним и тем же ключом переходили в один раздел, а в этом разделе сообщения прописал.
В двух словах вам нужно будет разработать решение на два уровня, подобное логически выше, чтобы получать сообщения, упорядоченные по нескольким разделам.