每个 Web 服务器的 Azure 服务总线主题订阅

Posted

技术标签:

【中文标题】每个 Web 服务器的 Azure 服务总线主题订阅【英文标题】:Azure Service Bus topic subscription per web server 【发布时间】:2015-11-03 01:37:30 【问题描述】:

我正在努力将 SignalR 体验集成到 Azure 基础架构中。

基本上,用户在网站上采取一些行动会触发网络服务器上的函数调用(通过 SignalR)。处理该请求可能需要一些时间,用户可能只需单击一下即可发送数十或数百个请求。我正在创建一个服务总线队列以将这些任务发送到 WebJob/Worker 以处理它们,一旦它们准备好,它们会将其发送回另一个队列(响应队列)。

也就是说,为了提供出色的用户体验,如果用户仍然像以前一样在同一页面上并且处理已准备好,我希望它在这些任务完成时为他们实时更新它。如果用户被固定到单个前端框(由于 SignalR WebSocket 连接),这应该是微不足道的,但事实并非如此,因此不同的前端可能需要处理该响应消息并通过 SignalR 调用浏览器。

当我在第一个队列中发布消息时,我将包含 SignalR ConnectionId。响应完成后,该 ConnectionId 将包含在响应消息中,这让我有机会调用。

HubContext.Clients.Client(connectionId).AddItemsResult(response);

我的问题是关于服务总线主题的——或者我不完全理解的另一个解决方案。我需要通知每个 WebServer 处理的每个响应,因为我无法确定哪个 Web 服务器实际将 SignalR 调用给客户端。

1) 服务总线主题是正确的方法吗?

2) 我需要动态创建 N 个订阅(每个 Web 服务器一个)似乎很奇怪。如果服务器死了并且再也没有回来会发生什么?我的订阅没有订阅者了?

基本上,我只想创建一个简单的发布者-订阅者模式,在其中我可以有 N 个动态订阅者(监听者)在线时。

【问题讨论】:

我可能在这里遗漏了一些东西,但我认为您希望传递UserId 而不是connectionId,然后跟踪集线器@987654324 中每个用户的connectionId 集@/OnDisconnected/OnReconnected 事件。然后,如果您在启动时配置 SignalR 以使用某些东西进行横向扩展(例如 Redis 或服务总线)。现在,当您的集线器收到消息时,您会找到关联用户的一组 connectionId 堡垒,并向他们发送消息。 【参考方案1】:

您需要实现某种状态存储,当每个用户请求的处理完成时更新该状态存储。然后让客户端定期轮询以获取使用请求的该状态存储的最新状态。此外,您需要维护该状态存储,以便用户可以判断他们的请求是否已完成跨多个用户/客户端会话的处理。 Scheduler Agent Supervisor 消息传递设计模式应该可以帮助您实现您想要构建的内容。

以下是调度程序代理主管消息传递设计模式的一个很好的解释:

Scheduler Agent Supervisor pattern

【讨论】:

以上是关于每个 Web 服务器的 Azure 服务总线主题订阅的主要内容,如果未能解决你的问题,请参考以下文章

在 web api 中接收服务总线消息队列/主题

Azure 服务总线:使用函数、服务结构和 Web 作业? [关闭]

集成 Azure 服务总线主题和 Azure 函数

查看Azure服务总线死信的申请

Service Fabric Actor 订阅 Azure 服务总线主题

如何删除 Azure 服务总线主题上的死信消息