#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. Вот скриншот: