Повторите логику для 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 для отправки ваших событий, чтобы автоматически распределять ваши события между разделами вашего концентратора событий в течение наибольшего времени и помечать ваши события свойством состояния последовательности для обеспечения упорядочения. и сохраняйте состояние ваших событий приложением обработки.

Другие вопросы по тегам