在 Azure.Messaging.ServiceBus 中创建 ServiceBusMessageBatch 时出现超时错误

Timeout error when creating ServiceBusMessageBatch in Azure.Messaging.ServiceBus

我有以下代码,在同一个服务总线客户端上的长时间 运行 测试期间开始出现错误。

ServiceBusMessageBatch batch = this._serviceBusSender.CreateMessageBatchAsync().GetAwaiter().GetResult();

错误是,

Azure.Messaging.ServiceBus.ServiceBusException: 'The operation did not complete within the allocated time 00:01:00 for object request42. (ServiceTimeout)'

为什么这个语句会抛出这个错误?批处理对象的创建是否是一项繁重的操作,甚至会超时?如果是这种情况,我是否应该切换到使用 ServiceBusMessage 列表的重载而不是这种批处理模式?

我的理解是,这种创建批次的方式可以保护我不创建队列可能不允许的批次。我发现很难理解为什么它会在 1 分钟后超时

.

为了使批处理能够强制限制大小,它必须为您要发送到的实体建立一个 AMQP link 并从服务。这会导致网络操作在本例中超时。只有在尚未建立现有 AMQP link 的情况下才会执行此开销 - 通常在需要网络操作的第一次调用时执行。

我从你的代码中跳出来的是使用 GetAwaiter().GetResult() 来执行异步同步。这确实不是一个好主意,并且很可能导致线程池中的争用,从而阻止及时安排延续。因为服务总线中的网络操作是异步的 - 包括建立 AMQP link - 调度延续的延迟肯定会增加超时的机会。

我强烈建议重构异步同步代码路径并转向异步方法。在那些不可能完全异步的情况下,将异步同步限制在代码的最外层将是下一个最好的选择。