Ответ 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".
Как вы можете видеть, есть один блок для каждого раздела. Мое предположение состоит в том, что эти капли используются для двух вещей. Первым из них является аренда Blob для распределения разделов между экземплярами, см. здесь, вторая - сохранение смещений внутри раздела, который был зафиксирован.
Вместо того, чтобы данные передаются в группы потребителей, экземпляры потребления запрашивают у системы хранения данные с некоторым смещением в одном разделе. EventProcessorHosts - хороший способ высокого уровня наличия логической группы потребителей, в которой каждый раздел считывается только одним пользователем за раз, и когда прогресс, который логическая группа потребителей сделал в каждом разделе, не забывается.
Помните, что пропускная способность для каждого раздела измеряется так, что если вы достигнете максимального входного сигнала, у вас могут быть только два логических потребителя, которые все до скорости. Таким образом, вы захотите убедиться, что у вас достаточно разделов и единиц пропускной способности, которые вы можете:
- Прочитайте все отправленные вами данные.
- Займитесь в течение 24-часового периода хранения, если вы отстаете на несколько часов из-за проблем.
В заключение: группы потребителей - это то, что вам нужно. Примеры, которые вы читаете, которые используют определенную группу пользователей, хороши, в каждой логической группе потребителей используются одно и то же имя для группы пользователей Azure и разные логические группы потребителей используют разные.
Я еще не использовал Azure Stream Analytics, но, по крайней мере, во время предварительного просмотра вы ограничены группой пользователей по умолчанию. Поэтому не используйте группу потребителей по умолчанию для чего-то еще, и если вам нужны две отдельные партии Azure Stream Analytics, вам может понадобиться сделать что-то неприятное. Но это легко настроить!