3

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

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

使用这种类型的配置,您必须记住,如果您要发送到的特定分区不可用,您将收到错误响应。作为比较点,如果您对单个分区没有关联性,事件中心服务会将您的事件发送到下一个可用分区。

因此,如果出现错误,我想实现尝试使用另一个分区发送的重试逻辑。(我有 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)
            {

            }         
    }
4

1 回答 1

0

正如我所知,您可以利用该PartitionSender对象将事件发送到特定分区,以确保您的应用程序的一致性。此外,当您发送的特定分区不可用时,您可以捕获异常,然后将您的事件发送到另一个特定分区。但是此时,您的辅助分区有时可能不可用,您需要添加额外的逻辑来处理来自该分区的事件。

根据我的理解,您可以利用EventHubClient.Send方法来发送您的事件,以便在您的事件中心的分区之间自动分配您的事件以获得最大的正常运行时间,并使用自定义序列状态属性标记您的事件以确保排序并通过您的处理应用程序保持您的事件状态。

于 2017-03-20T07:56:22.797 回答