Azure ServiceBus 订阅客户端 <--> 服务器通信(接收和响应)

Azure ServiceBus Subscription Client <--> Server communication (receive and respond)

我将如何处理客户端 <--> 服务器与 Azure 中的 ServiceBus 的通信?

目前我创建了一个新的队列名称"TestQueue"。我在队列上创建了一个名为 "TestTopic" 的主题,并且我订阅了一个正在使用 SqlFilterRule (Device = 'A').

监听名称 "DeviceA" 的订阅

然后我创建了一个客户端,它向上面指定的队列发送一个包,我在那里收到一条消息,我可以评估它,一切都很好。

现在我想向我的客户发回一些东西,也许我想 "keep talking" 给客户。所以我正在考虑来自 DeviceA(正在监听订阅)和客户端的 "direct" 连接,客户端正在与设备通信,同时也在监听订阅。

我希望你明白我想要什么,也许服务总线并不是我需要的...

让客户端拥有一个回复队列。然后,客户端可以在发送给最终接收者的消息的 ReplyTo 属性 上传递该队列的地址,然后接收者转身与该队列对话。这是一个常见的模式,也是为什么我们有 built-in 属性.

如果您跨 SB 名称空间使用此方法(即回复队列位于不同的名称空间中)或者您使用差异化访问控制,即仅客户端对目标 topic/queue 拥有 "send" 权限,并且不希望每个人都能够发送到自己的回复队列。

客户端将 short-lived 令牌传递给接收方以允许其发送回复的方法是这样的:

var token = 
        TokenProvider.CreateSharedAccessSignatureTokenProvider( 
                [[rulename]], [[key]]) 
       .GetWebTokenAsync([[targetUri]], string.Empty, true, 
                TimeSpan.FromHours(1))
       .GetAwaiter().GetResult(); 

在您的命名空间或具有 "Send" 权限的回复队列中有一个 SAS 规则,并将其用于 [[rulename]] 和 [[key]]。 [[targetUri]] 是回复队列的完全限定 URI(带有命名空间)。时间跨度表示该令牌的有效期。我在这里使用一个小时,但很可能是几秒钟或几分钟或一天。

然后您将该令牌与消息一起传递;它可以驻留在(自定义)消息 属性 中,命名为 "ReplyToToken"。

接收方从那个 属性 中获取令牌,然后用它创建一个令牌提供者

TokenProvider.CreateSharedAccessSignatureTokenProvider(tokenValue)));

然后您 create a fresh MessagingFactory 使用 ReplyTo 值和此令牌提供程序的基本 URI(无路径),然后 QueueClient 使用 ReplyTo 值的路径。

为了保持对话的进行,您可以将 QueueClient 和工厂保存在由 ReplyTo URI 键入的查找 table 中,而不是每次收到消息时都重新创建回复路径,而是从缓存中获取它.