Azure Eventhub отправляет данные в определенный раздел C # - PullRequest
0 голосов
/ 07 мая 2018

Я использую Azure EventHub для потоковой передачи данных устройств, и я хочу, чтобы каждый Данные устройства будут отправлены в тот же раздел. Поток отправляет данные в iot hub, где каждое устройство имеет свой собственный ключ раздела, и отправляет их в eventhub с тем же ключом раздела, что и ключ раздела iot hub (они имеют одинаковое количество разделов). Я попытался установить свойство eventdata.partitionkey равным ключу раздела iothub, но теперь я понимаю, что это свойство является хеш-значением, и если я устанавливаю параметр keykey = 1, он не обязательно перейдет к разделу 1. И с этим решением распределение разделов eventhub довольно плохо (половина разделов вообще не получает никаких данных). Я также пытался использовать CreatePartitionedSender, который дает результат, но каждый раз, когда я создаю отправителя раздела, это похоже на создание клиента EventHub, и я получаю сообщение о количестве соединений (количество соединений AMQP на ограничение пространства имен).

Какое будет лучшее решение:

  1. Напишите фабричный класс (фабрика уже написана?) Для PartitionSender, поэтому у меня будет 1 клиент для каждого раздела, и мне придется обрабатывать состояние и, возможно, некоторый параллелизм.
  2. Работа со свойством eventdata.partitionkey и установка лучшего хеш-значения (может быть, идентификатор устройства вместо номера раздела), и мне не нужно писать что-либо дополнительное или обрабатывать ошибки соединения.

Или, может быть, есть лучшее решение?

Обновление: Я попытался установить для eventdata.partitionkey идентификатор устройства, но я получил ошибку «Все данные события в операции SendBatch должны иметь один и тот же ключ раздела». Так что это плохое решение, так как, если я разделю каждую отправку по ключу раздела У меня будет много операций отправки маленьких кусочков вместо 1

. Спасибо.

1 Ответ

0 голосов
/ 15 мая 2018

Когда я делал похожие вещи, я в основном использовал вариант 2, который состоит из одной операции отправки на ключ раздела. С точки зрения количества операций отправки это явно не идеально, но вы должны быть в состоянии измерить влияние на производительность, чтобы увидеть, если это проблема. И тогда вы, конечно, можете решить использовать несколько кратных количества разделов в качестве отдельных хеш-ключей, чтобы при повторном перезаписи Azure вам не приходилось слишком сильно беспокоиться о коллизиях и возникающем дисбалансе. То есть с 32 разделами, возможно, используется 128 (или более) различных значений ключа раздела, так что один раздел выходит из баланса с шагом 25% (или менее), а не 100%.

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

Кроме того, если вы используете шаблон отправки с разделенными отправителями - все они также будут использовать один и тот же базовый MessagingFactory - если вы создадите всех отправителей из одного экземпляра eventHubClient (.CreatePartitionedSender ()).

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