Подтвердить что ты не робот

Узлы событий Azure и несколько групп потребителей

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

Вот приблизительное описание проблемы и предлагаемого решения с использованием концентраторов событий (Я не уверен, является ли это оптимальным решением. Поблагодарите ваши отзывы)

enter image description here

У меня есть несколько источников событий, которые генерируют много данных о событиях (данные телеметрии от датчиков), которые необходимо сохранить в нашей базе данных, и некоторый анализ, например, среднее значение, min-max должно выполняться в parallel.

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

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

Во-первых, как мне настроить группы потребителей и есть ли что-то, что мне нужно сделать на стороне отправителя/получателя, чтобы копии событий появлялись во всех группах потребителей?

Я читал много примеров в Интернете, но они либо используют client.GetDefaultConsumerGroup();, и/или имеют все разделы, обрабатываемые несколькими экземплярами одной и той же рабочей роли.

В моем сценарии, когда событие запускается, его необходимо обрабатывать двумя разными рабочими ролями параллельно (один из которых сохраняет данные и второй, который выполняет некоторый анализ)

Спасибо!

4b9b3361

Ответ 1

TL;DR: выглядит разумно, просто создайте две группы потребителей, используя разные имена с помощью CreateConsumerGroupIfNotExists.

Группы потребителей - это в первую очередь концепция, так что точно, как они работают, зависит от того, как реализованы ваши подписчики. Как вы знаете, концептуально они представляют собой группу подписчиков, работающих вместе, чтобы каждая группа получала все сообщения и при идеальных (не будет) обстоятельствах, вероятно, каждый раз потребляет каждое сообщение. Это означает, что каждая группа пользователей будет "имеет все разделы, обрабатываемые несколькими экземплярами одной и той же рабочей роли". Вы хотите этого.

Это может быть реализовано по-разному. Microsoft предоставила два способа напрямую использовать сообщения из концентраторов событий, а также возможность использовать такие вещи, как Streaming Analytics, которые, вероятно, построены поверх двух прямых способов. Первый способ - это Event Hub Receiver, второй - более высокий уровень Хост процессора событий.

Я не использовал Event Hub Receiver, поэтому этот конкретный комментарий основан на теории того, как эти виды систем работают и спекулируют из документация: Хотя они созданы из EventHubConsumerGroups, это нецелесообразно поскольку эти приемники не координируют друг с другом. Если вы их используете, вам понадобится (и может!) Выполнить всю координацию и совершить смещения самостоятельно, что имеет преимущества в некоторых сценариях, таких как запись смещения в транзакционную БД в ту же транзакцию, что и вычисленные агрегаты. Используя эти низкоуровневые приемники , имеющие разные логические группы потребителей, использующие одну и ту же потребительскую группу Azure, вероятно, не должны (нормативные не практические советы) быть особенно проблематичными, но вы должны использовать разные имена, если это имеет значение или вы переходите на EventProcessorHosts.

Теперь на более полезную информацию EventProcessorHosts, вероятно, построены поверх EventHubReceivers. Они являются более высокоуровневыми, и есть поддержка, позволяющая нескольким машинам работать вместе как логическая группа потребителей. Ниже я включил слегка отредактированный фрагмент кода, который делает EventProcessorHost с кучей комментариев, оставшихся при объяснении некоторых вариантов.

//We need an identifier for the lease. It must be unique across concurrently 
//running instances of the program. There are three main options for this. The 
//first is a static value from a config file. The second is the machine NETBIOS
//name ie System.Environment.MachineName. The third is a random value unique per run which
//we have chosen here, if our VMs have very weak randomness bad things may happen.

string hostName = Guid.NewGuid().ToString();

//It not clear if we want this here long term or if we prefer that the Consumer 
//Groups be created out of band. Nor are there necessarily good tools to discover 
//existing consumer groups.
NamespaceManager namespaceManager = 
    NamespaceManager.CreateFromConnectionString(eventHubConnectionString);
EventHubDescription ehd = namespaceManager.GetEventHub(eventHubPath);
namespaceManager.CreateConsumerGroupIfNotExists(ehd.Path, consumerGroupName);

host = new EventProcessorHost(hostName, eventHubPath, consumerGroupName, 
    eventHubConnectionString, storageConnectionString, leaseContainerName);
//Call something like this when you want it to start
host.RegisterEventProcessorFactoryAsync(factory)

Вы заметите, что я сказал Azure, чтобы создать новую группу потребителей, если она не существует, вы получите прекрасное сообщение об ошибке, если это не так. Я честно не знаю, какова цель этого, потому что в нем нет строки подключения к хранилищу, которая нуждается в, чтобы быть одинаковой для всех экземпляров, чтобы координация EventProcessorHost (и предположительно совершает) должным образом.

Здесь я представил картинку из Azure Storage Explorer арендует лизинг и предположительно смещает из группы потребителей, с которой я экспериментировал в ноябре, Обратите внимание, что хотя у меня есть testhub и testhub-testcg, это связано с тем, что их вручную называет. Если бы они были в одном контейнере, это были бы такие вещи, как "$ Default/0" и "testcg/0". Event Hub Leases

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

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

Помните, что пропускная способность для каждого раздела измеряется так, что если вы достигнете максимального входного сигнала, у вас могут быть только два логических потребителя, которые все до скорости. Таким образом, вы захотите убедиться, что у вас достаточно разделов и единиц пропускной способности, которые вы можете:

  • Прочитайте все отправленные вами данные.
  • Займитесь в течение 24-часового периода хранения, если вы отстаете на несколько часов из-за проблем.

В заключение: группы потребителей - это то, что вам нужно. Примеры, которые вы читаете, которые используют определенную группу пользователей, хороши, в каждой логической группе потребителей используются одно и то же имя для группы пользователей Azure и разные логические группы потребителей используют разные.

Я еще не использовал Azure Stream Analytics, но, по крайней мере, во время предварительного просмотра вы ограничены группой пользователей по умолчанию. Поэтому не используйте группу потребителей по умолчанию для чего-то еще, и если вам нужны две отдельные партии Azure Stream Analytics, вам может понадобиться сделать что-то неприятное. Но это легко настроить!