这么多Service Bus Transient Errors?

时间:2017-05-18 23:49:52

标签: c# azure network-programming azureservicebus

我们有两个Windows服务,它们存在于企业内部部署服务器上,并且不断向云服务总线发送消息。虽然消息最终最终会在服务总线上出现,但有些时候消息似乎永远无法在很长一段时间内完成。

这导致了我们的延迟问题,因为我们依赖于到达服务总线并在一分钟内处理的消息。但是,如下所示,邮件可以被阻止'在进入Azure Service Bus之前,最长可达30-40分钟。这种情况每天都发生,几乎在每个小时的某个时间发生。

错误主要是以下之一(本帖末尾的示例日志):

  • 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机无法响应191.239.XX.XXX:443

  • 与Service Bus通信时出错。检查连接信息,然后重试。

  • 没有这样的主人知道

  • 请求操作未在分配的超时00:01:10内完成。分配给此操作的时间可能是较长超时的一部分。 TrackingId:f2db6377-e17d-401a-b339-11fbb51c7bf7,时间戳:19/05/2017 12:47:36 AM

我们向服务总线发送消息的方式如下,简化如下:

private TopicClient _azureTopic;

...
<Begin Loop>

if (_azureTopic == null)
{
   var connectionString = "Endpoint=sb://mynamespace.servicebus.windows.net/;SharedAccessKeyName=managerfiddev;SharedAccessKey=AABBCCDDEEFFGGHHHASDFADFAadfadfdfz=EntityPath=mytopic";
   _azureTopic = TopicClient.CreateFromConnectionString(connectionString);
   _azureTopic.RetryPolicy = RetryPolicy.NoRetry;
}

var brokeredMessage = new BrokeredMessage(message.Message)
{
    MessageId = message.Id.ToString()
};
brokeredMessage.Properties["ReceivedTimestamp"] = DateTime.Now;

_azureTopic.Send(brokeredMessage);

<End Loop>

注意:   有一个故意的原因,我们有一个NoRetry政策。如果不想在问题中添加太多噪音,将在下一次迭代中再次尝试失败的相同消息(它以循环方式将消息发送给订阅者)。

在一小段时间内记录错误的示例。

  

20:31:51 Event.WindowsService Event.WindowsService :: PublishAzureServiceBusTopicMessage()   尝试与Azure同步消息时出错。消息ID:1191251
  与Service Bus通信时出错。检查连接   信息,然后重试。

     

20:32:00 Event.WindowsService Event.WindowsService :: PublishAzureServiceBusTopicMessage()   尝试与Azure同步消息时出错。消息ID:1191251
  没有这样的主人知道

     

20:32:00 RFID.WindowsService RFID.WindowsService :: PublishAzureServiceBusTopicMessage()   尝试与Azure同步消息时出错。消息ID:1930029
  没有这样的主人知道

     

20:32:10 RFID.WindowsService RFID.WindowsService :: PublishAzureServiceBusTopicMessage()   尝试与Azure同步消息时出错。消息ID:1930029
  没有这样的主人知道

     

20:32:10 Event.WindowsService Event.WindowsService :: PublishAzureServiceBusTopicMessage()   尝试与Azure同步消息时出错。消息ID:1191251
  没有这样的主人知道

     

20:32:10 RFID.WindowsService RFID.WindowsService :: PublishAzureServiceBusTopicMessage()   尝试与Azure同步消息时出错。消息ID:1930029
  没有这样的主人知道

     

20:34:00 RFID.WindowsService RFID.WindowsService :: PublishAzureServiceBusTopicMessage()   尝试与Azure同步消息时出错。消息ID:1930034
  与Service Bus通信时出错。检查连接   信息,然后重试。

     

20:38:34 Event.WindowsService Event.WindowsService :: PublishAzureServiceBusTopicMessage()   尝试与Azure同步消息时出错。消息ID:1191269
  与Service Bus通信时出错。检查连接   信息,然后重试。

     

20:38:51 RFID.WindowsService RFID.WindowsService :: PublishAzureServiceBusTopicMessage()   尝试与Azure同步消息时出错。消息ID:1930043
  与Service Bus通信时出错。检查连接   信息,然后重试。

1 个答案:

答案 0 :(得分:0)

Service Bus在Namespace Manager,Messaging Factory和Client上具有本机重试功能(请参阅Retry guidance for specific services)。

因为它处理瞬态异常,所以不应该有重复发送的消息。

如果您只想重试一次您可以这样配置:

var connectionString = "myconnectionstring";
var client = TopicClient.CreateFromConnectionString(connectionString);
client.RetryPolicy = new RetryExponential(minBackoff: TimeSpan.FromSeconds(2),
                                        maxBackoff: TimeSpan.FromSeconds(2),
                                        maxRetryCount: 1);

这应该可以解决问题。

如果您想确保重复数据删除,只需google azure servicebus重复数据删除。