2015-04-23 3 views
13

Согласно документации Apache Kafka, порядок сообщений может быть достигнут в разделе или одном разделе в теме. В этом случае, какова польза параллелизма, которую мы получаем, и она эквивалентна традиционным MQ, не так ли?Порядок сообщений Apache Kafka с несколькими разделами

+3

Это немного похоже на высказывание: * Если я поместил блок синхронизации во весь мой код, где многопользовательская выгода? * Вы можете максимально использовать параллелизм kafka, если вы хорошо разделяете свои данные, и вам действительно не нужно заказ. Если ваш конкретный прецедент требует использования одного раздела, то да, вы не увидите преимущества параллелизма, но это не недостаток кафки - вам, возможно, придется подумать о своем прецеденте. Я признаю, что могут быть реальные случаи использования в мире, которые не являются хорошими кандидатами на кафку. – RaGe

ответ

32

В Кафке параллелизм равен количеству разделов для темы.

Например, предположим, что ваши сообщения разбиты на разделы на 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.

+1

Да, @ Джон. Но в приведенном выше случае нет гарантии, что сообщения будут получены в том же порядке, который отправляется. Я имею в виду это, http://stackoverflow.com/questions/21293937/apache-kafka-message-consumption-when-partitions-outnumber-consumers –

+0

Да нет такой гарантии. В этом случае вам придется использовать один раздел для своей темы, и вы потеряете возможность распараллеливания. Возможно, вам придется переосмыслить проблему. –

+2

@ RajanR.G Думаю, вам следует просто разделить свои сообщения, когда их создаете. Например, вы можете разделить на user_id, а затем ваши сообщения для определенного user_id поступят в определенный раздел (который всегда будет таким же) и, таким образом, гарантируют, что все сообщения для этого user_id останутся в порядке. Вам не нужно сохранять порядок между разными user_ids, не так ли? – serejja

12

Я решил переместить свой комментарий на отдельный ответ, поскольку я думаю, что имеет смысл сделать это.

Хотя Джон на 100% прав, о чем он писал, вы можете подумать о переосмыслении своей проблемы. Вам действительно нужны ВСЕ сообщения, чтобы оставаться в порядке? Или вам нужны все сообщения для определенного user_id (или что-то еще), чтобы оставаться в порядке?

Если первое, то вы не можете много сделать, вы должны использовать 1 раздел и потерять все возможности параллелизма.

Но если во втором случае вы можете разделить свои сообщения на какой-то ключ, и поэтому все сообщения для этого ключа поступят в один раздел (они могут перейти на другой раздел, если вы измените размер темы, но это другой случай) и, таким образом, гарантирует, что все сообщения для этого ключа в порядке.

+0

Спасибо за ваши комментарии. Давайте рассмотрим пример обновлений баз данных, который должен быть последовательным, если мы передадим сообщения другим системам. В этом случае Kafka может использоваться только для передачи журнала, а не для любой системы обмена сообщениями в режиме реального времени, не так ли? В противном случае мы должны построить ReSequencer на потребительском http://www.enterpriseintegrationpatterns.com/Resequencer.html. Вместо этого мы можем использовать RabbitMQ или другие MQ, не так ли? –

+0

К сожалению, у меня нет опыта в других MQ, поскольку я знаком только с Kafka. В любом случае, я думаю, что это сильно зависит от того, что вы намерены делать с данными. Это может быть случай, когда вы должны проверить другие решения вместо Kafka. – serejja

2

В Кафка сообщения с тем же ключом , из того же продюсера, доставляются потребителю в порядке

еще одна вещь, на вершине, что, данных в пределах раздела будут сохранены в порядке который, как это записано, считывает данные, читаемые из раздела, для этого раздела.

Так что, если вы хотите, чтобы ваши сообщения упорядочивались по нескольким разделам, вам действительно нужно группировать сообщения с помощью клавиши , так что сообщения с одним и тем же ключом попадают в один раздел и с этим p исправление сообщений упорядочено.

В двух словах вам потребуется разработать решение на уровне двух уровней, как описано выше, чтобы получить сообщения, упорядоченные по нескольким разделам.

Смежные вопросы