我们有两个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通信时出错。检查连接 信息,然后重试。
答案 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重复数据删除。