【问题标题】:Azure Service Bus topic subscription per web server每个 Web 服务器的 Azure 服务总线主题订阅
【发布时间】: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 堡垒,并向他们发送消息。

标签: asp.net azure signalr azureservicebus


【解决方案1】:

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

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

Scheduler Agent Supervisor pattern

【讨论】:

    猜你喜欢
    • 2019-02-12
    • 2018-08-27
    • 2016-02-10
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 2018-07-18
    相关资源
    最近更新 更多