Azure EventHub PartitionedSender的重试逻辑

时间:2017-03-19 13:17:18

标签: c# azure azure-eventhub retry-logic

我正在从Azure Event Hub发送/接收数据。由于我有一个要求消息必须由消费者按顺序处理,我决定使用PartitionSender并始终将事件发送到同一个分区。

https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-availability-and-consistency中的“一致性”下,它描述了PartitionSender:

使用此类配置时,您必须记住,如果您要发送的特定分区不可用,您将收到错误响应。作为比较,如果您对单个分区没有亲缘关系,Event Hubs服务会将您的事件发送到下一个可用分区。

因此,如果出现错误,我想实现尝试使用其他分区发送的重试逻辑。 (我有4个)

我不知道如何触发此错误,所以我有点不确定代码在哪里实现重试逻辑。

我的猜测是那将抛出的“Sender.SendAsync(data)”,它在这里我应该实现重试逻辑

这是相关代码:

    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 个答案:

答案 0 :(得分:0)

众所周知,您可以利用PartitionSender对象将事件发送到特定分区,以确定应用程序的一致性。此外,您可以在发送的特定分区不可用时捕获异常,然后将事件发送到另一个特定分区。但此时,您的辅助分区可能在某个时间不可用,您需要添加其他逻辑来处理来自该分区的事件。

根据我的理解,您可以利用EventHubClient.Send方法发送您的活动,以便在您的事件中心的分区之间自动分配您的事件以获得最长的正常运行时间,并使用自定义序列标记您的事件州财产,以确保您的处理应用程序订购和保持您的事件的状态。