【Azure Service Bus】 Service Bus如何确保消息发送成功,发送端是否有Ack机制 

时间:2023-03-09 13:41:12
【Azure Service Bus】 Service Bus如何确保消息发送成功,发送端是否有Ack机制 

问题描述

Service Bus如何确保消息发送成功,发送端是否有Ack机制(是否有回调API告诉发送端,服务端已经收到消息)?根据对.NET发送Service Bus消息代码的分析,发送方法queueClient.SendAsync(message)并没有返回值,所以无法知道发送消息是否成功。

【Azure Service Bus】 Service Bus如何确保消息发送成功,发送端是否有Ack机制 

问题根源

Azure 服务总线已针对持久性进行优化,会确保在服务确认请求成功之前,发送到服务总线的所有数据将提交到存储。一旦服务总线成功“ACK”(确认)请求,即表示服务总线已成功处理该请求。 如果服务总线返回“NACK”(失败),则表示服务总线无法处理该请求,客户端应用程序必须重试该请求。官方提供的SDK,在没有自定义RetryPolicy的情况下,都会采用默认的重试机制。

Service Bus .Net SDK 默认的重试机制(RetryPolicy)为:

  • DeltaBackoff: 重试之间的间隔时间
  • MaxRetryCount: 最大重试次数
  • MaximumBackoff: 最大的间隔时间
  • MinimalBackoff: 最小的间隔时间

【Azure Service Bus】 Service Bus如何确保消息发送成功,发送端是否有Ack机制 

所以在调用Service Bus SDK发送消息时,如果代码正常执行且没有Exception,则表示消息成功发送。

【Azure Service Bus】 Service Bus如何确保消息发送成功,发送端是否有Ack机制 

一句话总结为:无错即成功,失败看异常。

另外也有如下两种发送俩查看消息:

方式一:在Azure Service Bus门户中查看指标 Incoming request/message

【Azure Service Bus】 Service Bus如何确保消息发送成功,发送端是否有Ack机制 

方式二:通过Servie Bus Explorer工具查看发送消息的内容

【Azure Service Bus】 Service Bus如何确保消息发送成功,发送端是否有Ack机制 

参考资料

Service Bus Explorer: https://github.com/paolosalvatori/ServiceBusExplorer/releases

Service Bus Retry Policy: https://docs.microsoft.com/en-us/azure/architecture/best-practices/retry-service-specific#service-bus