Повторите логику для Azure EventHub PartitionedSender
Я отправляю / получаю данные из концентратора событий Azure. Поскольку у меня есть требования, сообщения должны обрабатываться потребителем последовательно, я решил использовать PartitionSender и всегда отправлять события в один и тот же раздел.
В разделе "Согласованность" в https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-availability-and-consistency говорится о PartitionSender:
При таком типе конфигурации вы должны помнить, что если конкретный раздел, на который вы отправляете, недоступен, вы получите ответ об ошибке. Для сравнения: если у вас нет привязки к одному разделу, служба концентраторов событий отправляет ваше событие следующему доступному разделу.
Поэтому, если есть ошибка, я хочу реализовать логику повторных попыток, которая пытается отправить с использованием другого раздела. (У меня 4)
Я не знаю, как вызвать эту ошибку, поэтому я немного не уверен, где в коде я должен реализовать логику Retry.
Я думаю, что это "Sender.SendAsync(данные)", который будет выдавать, и именно здесь я должен реализовать логику повторных попыток
Это соответствующий код:
private EventHubSender _sender;
private EventHubSender Sender(int partitionId)
{
if (_sender == null)
{
_sender = CreatePartitionedSender(partitionId);
}
return _sender;
}
private static EventHubSender CreatePartitionedSender(int partitionId)
{
var eventHubClient = EventHubClient.CreateFromConnectionString(SnakeHubSendSas);
return eventHubClient.CreatePartitionedSender(partitionId.ToString());
}
public void SendToEventHub(string json, long sequenceNumber)
{
Console.WriteLine("");
Console.WriteLine("Sending message: sequence number '" + sequenceNumber + "'");
var data = new EventData(Encoding.UTF8.GetBytes(json));
data.Properties.Add("SequenceNumber", sequenceNumber);
try
{
Sender(1).SendAsync(data);
}
catch (Exception ex)
{
}
}
1 ответ
Как я знаю, вы могли бы использовать PartitionSender
объект для отправки событий в определенный раздел относительно согласованности для вашего приложения. Кроме того, вы можете перехватить исключение, когда конкретный раздел, который вы отправляете, недоступен, а затем отправить ваши события в другой конкретный раздел. Но в этот момент ваш дополнительный раздел может быть недоступен в какое-то время, и вам нужно добавить дополнительную логику для обработки событий из этого раздела.
Насколько я понимаю, вы можете использовать метод EventHubClient.Send для отправки ваших событий, чтобы автоматически распределять ваши события между разделами вашего концентратора событий в течение наибольшего времени и помечать ваши события свойством состояния последовательности для обеспечения упорядочения. и сохраняйте состояние ваших событий приложением обработки.