每天早上在天蓝色的eventhub中摄取失败

时间:2017-04-12 22:03:25

标签: c# .net azure azure-eventhub

向eventhub发送事件会在每个清晨都失败,并显示以下消息。我已经屏蔽了这个号码,因为我不确定这个号码是什么,出于安全考虑。(下面的代码和错误)

  1. 我一直发送每分钟非常小的~240个事件,所以这不应该是问题。
  2. 我的eventhub有2个分区和2个消费者 如果您有任何人知道解决方案或需要更多信息,请告诉我。 谢谢!
  3. 错误: 消息:与' XXXXX06f186e4bb89aea2d8959bXXXXX_GXX'进行通信时发生错误。检查连接信息,然后重试。

    StackTrace:在Microsoft.ServiceBus.Common.AsyncResult.End [TAsyncResult](IAsyncResult结果) Microsoft.ServiceBus.Messaging.Amqp.FaultTolerantObject1.OnEndCreateInstance(IAsyncResult asyncResult)中的Microsoft.ServiceBus.Common.AsyncResult1.End(IAsyncResult asyncResult) 在Microsoft.ServiceBus.Messaging.SingletonManager1.EndGetInstance(IAsyncResult的asyncResult)在Microsoft.ServiceBus.Messaging.Amqp.AmqpMessageSender.OnEndOpen(IAsyncResult的结果)在Microsoft.ServiceBus.Messaging.ClientEntity.EndOpen(IAsyncResult的结果)在Microsoft.ServiceBus.Messaging Microsoft.ServiceBus.Messaging.SingletonManager1.EndGetInstance(IAsyncResult asyncResult)中的.OpenOnceManager.OnEndCreateInstance(IAsyncResult asyncResult) 在Microsoft.ServiceBus.Messaging.OpenOnceManager.OpenOnceManagerAsyncResult1..ctor的Microsoft.ServiceBus.Common.AsyncResult.SyncContinue(IAsyncResult结果)中的Microsoft.ServiceBus.Messaging.OpenOnceManager.OpenOnceManagerAsyncResult1.OpenComplete(IAsyncResult结果)(OpenOnceManager openOnceManager,TimeSpan openTimeout, AsyncCallback回调,对象状态,Func3 beginOperation,EndOperation1 endOperation) 在Microsoft.ServiceBus.Messaging.OpenOnceManager.Begin(AsyncCallback回调,对象状态,Func3 beginOperation,Action1 endOperation) at Microsoft.ServiceBus.Messaging.MessageSender.BeginSendEventData(TrackingContext trackingContext,IEnumerable1 eventDatas,TimeSpan timeout,AsyncCallback callback,Object state)at Microsoft.ServiceBus.Messaging.EventHubSender。<> c__DisplayClass23_0.b__0(AsyncCallback c,Object s)at at Microsoft.ServiceBus.Common.Parallel.TaskHelpers.CreateTask的System.Threading.Tasks.TaskFactory1.FromAsyncImpl(Func3 beginMethod,Func2 endFunction,Action1 endAction,Object state,TaskCreationOptions creationOptions)(Func3 begin,Action`1 end,Object state) ---从抛出异常的先前位置开始的堆栈跟踪结束--- 在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.GetResult() 日期:2017年4月4日上午2:48:17

    代码:     EventHubClient deveventHubClient =     EventHubClient.CreateFromConnectionString(connectionString," EventHubName");

    private async Task SendInBatch(IList<byte[]> source, Guid UUID)
    {
    List events = new List(source.Select(b => new EventData(b)));
    
        EventHubSender Partition0;
        EventHubSender Partition1;
        Partition0 = deveventHubClient.CreatePartitionedSender("0");
        Partition1 = deveventHubClient.CreatePartitionedSender("1");
        if (UUID.GetHashCode() % 2 == 0)
        {
            await Partition0.SendBatchAsync(events);
        }
        else
        {
            await Partition1.SendBatchAsync(events);
        }
        return Unit.Default;
    }
    

1 个答案:

答案 0 :(得分:0)

短ANS

发送时可能会遇到暂时性错误。如果您想要绝对高度可用的代码 - 请考虑将代码更改为EventHubClient.sendBatchAsync(...),而不是使用PartitionedSender.sendBatchAsync(...)并在代码中删除% 2逻辑。

WHY

想象一下 - EventHubs是云/天蓝色的Events流。

在分布式环境中 - 故障必然会一直发生,尽管概率很低 - 例如:托管您的EventHub的VM可能会重新启动,其中一个n / W网关可能会失败并且连接可能会重置,托管代码的容器可能会体验高负荷和我们的负载平衡算法。可能会移动它等,

当故障发生时,我们希望我们的客户能够在不察觉故障的情况下发送到EventHubs。换句话说,为了向客户提供高可用性,我们暴露了partitions的概念。

当您使用EventHubClient.sendBatchAsync(...)发送时 - 我们的网关将检测哪个eventhub分区立即可用,并将事件路由到特定事件中心分区 - 如果有多个分区可用 - 它将循环(例如:就像你使用%2的方式一样)。

简单地说,不。 EventHubs的分区决定了EventHubs的高可用性程度。因此,如果您对连接失败很敏感 - 请考虑不再创建PartitionedSender并使用EventHubClient直接向EventHub发送事件。