Конфлюэнтные задачи Kafka dot net ProduceAsync - PullRequest
0 голосов
/ 06 июля 2018
var msgs = new List<string> {“msg1”, “msg2”, “msg3”};

var tasks = new List<Task>();

Foreach(var msg in msgs) {
         tasks.add(_producer.ProduceAsync(...)); }

var deliveryReports = Task.WhenAll(tasks).Result;

Мой конфиг производителя Kafka:

Размер партии: 10
Задержка: 100 мс

Мой вопрос: выполняются ли задачи в том порядке, в котором они были создано. Могу ли я гарантировать, что задача, представляющая msg1, завершена? перед задачей, представляющей msg2 или msg3.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 июля 2018

Хорошо, теперь я понимаю, как продюсер и брокер работают для достижения порядка.

Итак, когда вызывается ProduceAsync, он добавляет сообщение в буфер отправки, создает обещание, которое используется для завершения будущего.и возвращает future.So, он создает исходный объект завершения задачи и возвращает свою задачу.

Клиентская библиотека (librdkafka) ждет, пока не получит настроенное количество сообщений или период ожидания для пакетной обработки сообщений.Создается пакет, содержащий сообщения в том же порядке, что и в буфере отправки.Пакет разбивается (случайным образом, если используется секционер по умолчанию) в зависимости от целевых разделов / тем, т. Е. Разбивается на меньшие партии.Каждый пакет после разделения отправляется соответствующему ведущему брокеру / ISR (отдельные send () выполняются последовательно), и каждый пакет проверяется соответствующим лидерским брокером в соответствии с request.required.acks.Клиентская библиотека вызывает обратный вызов для каждого полученного подтверждения, и обратный вызов завершает свое соответствующее будущее, то есть taskCompletionSource.Set ();

0 голосов
/ 07 июля 2018

Здесь есть пара вещей.

Во-первых, librdkafka имеет возможность управлять повторными попытками для вас, и по умолчанию это делает ('retries' установлен на 2) - так что это может вызвать изменение порядка доставки сообщений и отчетов о доставке. Чтобы этого не произошло, вы можете установить «max.in.flight» на 1 (или «повторить» на 0 и управлять этим самостоятельно).

Когда librdkafka настроен на отправку отчетов о доставке обратно в .net в порядке отправки сообщений, вопрос становится одной из гарантий упорядочения выполнения Задачи. Мне нужно подумать об этом более 5 минут, чтобы дать хороший ответ, но пока предположим, что заказ не гарантирован (я напишу позже). Вы можете получить гарантированный заказ, используя варианты ProduceAsync, которые принимают обработчик IDeliveryReport. Обратите внимание, что в версии 1.0 эти методы будут несколько изменены и будут называться BeginProduce.

...