Размещение событий в центрах событий Azure с использованием политики, определенной в пространстве имен Event Hub

#azure #azure-eventhub

#azure #azure-eventhub

Вопрос:

Я создал пространство имен Event Hub и 2 концентратора событий. Я определил политику общего доступа (SAP) в пространстве имен Event Hub. Однако, когда я использую строку подключения, определенную в пространстве имен, я могу отправлять события только в один из концентраторов, даже если я создаю клиент, используя правильное имя концентратора событий

 function void SendEvent(connectionString, eventHubName){
        await using(var producerClient = new EventHubProducerClient(connectionString, eventHubName)) {
            // Create a batch of events 
            using EventDataBatch eventBatch = await producerClient.CreateBatchAsync();
            
            var payload = GetEventModel(entity, entityName);
            // Add events to the batch. An event is a represented by a collection of bytes and metadata. 
            eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes(payload.ToString())));
            
            // Use the producer client to send the batch of events to the event hub
            await producerClient.SendAsync(eventBatch);
            
            System.Diagnostics.Debug.WriteLine($"Event for {entity} sent to Hub {eventHubName}");
    }
}
  

Приведенный выше код вызывается для отправки событий в Hub1 и Hub2. Когда я использую строку подключения из SAP, определенную в пространстве имен, я могу отправлять события только в Hub1 или Hub2 в зависимости от того, что будет вызвано первым. Я указываю eventHubName как Hub1 или Hub2 по мере необходимости.

Я вызываю функцию SendEvent в своем вызывающем коде.

Единственный способ, которым я могу отправлять в оба концентратора, — это определить SAP на каждом концентраторе и использовать эту строку подключения при создании EventHubProducer

Я что-то упускаю или это сделано специально?

Комментарии:

1. Как вы проверяете отправку событий в Hub1 и Hub2? вы имеете в виду, что в первый раз вы используете код await using(var producerClient = new EventHubProducerClient(connectionString, Hub1)) {xx} для отправки в Hub1, затем на следующем шаге вы копируете тот же код, просто меняя Hub1 на Hub2?

2. Вам лучше добавить завершенный код.

3. @IvanYang обновил код, чтобы отразить фактическое использование

4. Не могли бы вы поделиться своей строкой подключения с отредактированной информацией общего ключа? Мне любопытно, используете ли вы строку подключения на уровне Event Hub, а не на уровне пространства имен.

5. @JesseSquire Я дважды проверил строку подключения. Я могу подтвердить, что это не проблема со строкой подключения. В CS уровня концентратора отсутствует имя концентратора.

Ответ №1:

Я провел быстрый тест на своей стороне, и он может хорошо работать на моей стороне.

Пожалуйста, попробуйте приведенный ниже код и дайте мне знать, если он не соответствует вашим потребностям:

 class Program
{
    //the namespace level sas
    private const string connectionString = "Endpoint=sb://yyeventhubns.servicebus.windows.net/;SharedAccessKeyName=mysas;SharedAccessKey=xxxx";

    //I try to send data to the following 2 eventhub instances.
    private const string hub1 = "yyeventhub1";
    private const string hub2 = "yyeventhub2";

    static async Task Main()
    {
        SendEvent(connectionString, hub1);
        SendEvent(connectionString, hub2);

        Console.WriteLine("**completed**");
        Console.ReadLine();
    }

    private static async void SendEvent(string connectionString, string eventHubName)
    {
        // Create a producer client that you can use to send events to an event hub
        await using (var producerClient = new EventHubProducerClient(connectionString, eventHubName))
        {
            // Create a batch of events 
            using EventDataBatch eventBatch = await producerClient.CreateBatchAsync();

            // Add events to the batch. An event is a represented by a collection of bytes and metadata. 
            eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes("First event: " eventHubName)));
            eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes("Second event: " eventHubName)));
            eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes("Third event: " eventHubName)));
            eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes("Fourth event: "   eventHubName)));
            eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes("Fifth event: "   eventHubName)));

            // Use the producer client to send the batch of events to the event hub
            await producerClient.SendAsync(eventBatch);
            Console.WriteLine("A batch of 3 events has been published to: "  eventHubName);
        }
    }

}
  

После запуска кода я вижу, что данные отправляются в оба из 2 экземпляров eventhub. Вот скриншот:

введите описание изображения здесь

введите описание изображения здесь