Есть ли способ ограничить количество инициализаций разделов для каждого потребителя в концентраторах событий? - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть C# Windows Сервис, который установлен на 3 разных серверах. Все эти 3 службы регистрируются в одном центре событий, который имеет 8 разделов. В каком-то смысле эти 3 сервера являются моими потребителями. После запуска службы windows несколько разделов могут быть инициализированы на разных серверах. Насколько я заметил, эта инициализация всегда случайна.

Скажем, сценарий инициализации выглядит следующим образом:

Сервер1: Раздел 0,1,2
Сервер2: Раздел 3,4
Сервер3: Раздел 5,6,7

Эта инициализация происходит с помощью этого кода:

  public Task OpenAsync(PartitionContext context)
    {
       Console.WriteLine($"SimpleEventProcessor initialized. Partition: '{context.PartitionId}'");
       return Task.CompletedTask;
    } 

Мое требование: несмотря на наличие нескольких разделов, я хочу инициализировать только один раздел для каждого потребителя / сервера. Есть ли способ ограничить инициализацию всех разделов?

Я подумал, что в сборке может быть какая-то функция, которая подсчитывает и сообщает номер уже инициализированных разделов. Так что я могу использовать, чтобы проверить, является ли значение «1», а затем пропустить инициализацию других разделов. Но я не мог найти такую ​​функцию.

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

Возможен ли этот сценарий?

1 Ответ

1 голос
/ 10 февраля 2020

Если это ваше требование, значит, вы используете неправильный SDK. Процессорный Host SDK разработан для использования всеми разделами и не позволит вам легко ограничить промежуточный менеджер разделов.

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

var receiver = eventHubClient.CreateReceiver(PartitionReceiver.DefaultConsumerGroupName, partitionId, PartitionReceiver.EndOfStream);

// Receive a maximum of 100 messages in this call to ReceiveAsync
var ehEvents = await receiver.ReceiveAsync(100);

// ReceiveAsync can return null if there are no messages
if (ehEvents != null)
{
    // Since ReceiveAsync can return more than a single event you will need a loop to process
    foreach (var ehEvent in ehEvents)
    {
        // Decode the byte array segment
        var message = UnicodeEncoding.UTF8.GetString(ehEvent.Body.Array);
        // Load the custom property that we set in the send example
        var customType = ehEvent.Properties["Type"];
        // Implement processing logic here
    }
}       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...