向eventhub发送事件会在每个清晨都失败,并显示以下消息。我已经屏蔽了这个号码,因为我不确定这个号码是什么,出于安全考虑。(下面的代码和错误)
错误: 消息:与' 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;
}
答案 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发送事件。