ServiceBusReceiver 与 Azure 服务总线通信时使用拉取还是推送通信模型?

Joe*_*erg 6 c# azureservicebus azure-servicebus-queues azure-servicebus-topics asp.net-core

ServiceBusReceiver.ReceiveMessageAsync()只是出于好奇:当我们调用并等待或时,幕后到底发生了什么ServiceBusReceiver.ReceiveMessageAsync(TimeSpan.FromMinutes(10))

a.) ServiceBusReceiver(长)轮询 Azure 服务总线或

b.) Azure 服务总线以某种方式发送推送通知到ServiceBusReceiver

我尝试查看源代码,但没有走得太远,因为InnerReceiver使用了一些我在代码库中找不到的类。

Eth*_*n.S 7

最终编辑

在ServiceBus Sdk层面,它是一种拉式通信模型,只是为了更好地处理传入消息的确认。

但在幕后,Azure 服务总线 sdk 使用高级消息队列协议 1.0,该协议不进行长轮询,它使用AmqpLink同一协议上的 sAmqpConnection将数据从发送方发送到接收方,接收方将传入消息保存到内存缓冲区中收到它们后。

您可以在此处阅读有关它的更多信息 ,或者观看 Microsoft 提供的有关AMQP 1.0 协议的视频系列。

因此,“幕后到底发生了什么”的答案似乎既不是 A 也不是 B,消息被推送到ReceivingAmqpLink(内存缓冲区),然后从中ServiceBusReceiver拉出。

我希望这个答案能够结束这次讨论,每个人都会高兴:)

源代码:

Azure.消息传递.ServiceBus

Azure.Amqp

ServiceBusReceiver包裹着AmqpReceiver

包裹ReceiveMessagesAsyncAmqpReceiver

ReceivingAmqpLink在 the 的构造函数中创建AmqpReceiver

ReceivingAmqpLink如果可能的话在同一连接上打开

将消息缓存在 的ReceivingAmqpLink缓冲区中

将消息从缓冲区拉入ReceiveAsyncResult

创建的公共异步函数ReceiveAsyncResult

调用“公共异步函数”AmqpReceiver.ReceiveMessagesAsync

  • Ethen的答案是正确的;客户端 API 模式对于接收器来说是基于拉式的,对于处理器来说是基于推式的。在幕后,信用在持久的 AMQP 链路上进行管理以控制消息流。当不使用预取时,只有当接收者请求消息时,信用才会被放置在链接上(这对于处理器来说是持续的,并且当接收者调用 ReceiveAsync 时) (2认同)
  • 顺便说一句,洞穴探险的来源很好。:) (2认同)