Кафка - Обеспечение того, что по крайней мере один потребитель получит сообщение - PullRequest
0 голосов
/ 20 апреля 2020

Я создаю распределенное приложение и решил представить Kafka. Однако мне трудно что-то выяснить.

Я понимаю, что наличие группы потребителей обеспечивает высокую доступность и высокую пропускную способность сообщений. Каждый потребитель в группе "следует" только за одним разделом в топи c. Скажем, например, что у нас есть 1 топи c с 4 разделами и одна группа потребителей с 4 потребителями. Каждый потребитель, как упоминалось ранее, будет получать сообщения только из назначенного ему раздела.

Теперь предположим, что у нас есть несколько производителей, публикующих sh сообщений в topi c. Один производитель записывает сообщение в раздел 1 topi c, а потребитель 1 получает его и выполняет с ним некоторую логику c, чтобы он был занят. Затем публикуется другое сообщение, но в том же разделе. Ни один из других потребителей не сможет получить его, поскольку раздел не «принадлежит» им.

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

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Вы можете использовать метод .assign() вместо .subscribe() для своих потребителей, чтобы они не входили ни в одну группу потребителей. Тем не менее, таким образом они будут получать все сообщения от назначенных разделов. Затем вы могли бы реализовать некоторую логику c на стороне клиента, чтобы предотвратить обработку сообщений, которые обрабатываются другими экземплярами, но в любом случае вы потеряете порядок и, скорее всего, гарантии доставки.

0 голосов
/ 20 апреля 2020

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...