Signalr 从不同的Azure角色通过scaleout直接发送信号器消息

Signalr 从不同的Azure角色通过scaleout直接发送信号器消息,signalr,azureservicebus,Signalr,Azureservicebus,我在Azure云服务应用程序中有两个角色:web角色(此处为信号器连接)和工作者角色 web角色使用Azure service bus作为其扩展提供程序 在特定时间点,工作角色将发出特定事件。我想将此数据直接发送到连接到集线器的客户端 我当前的实现涉及工作者角色将消息放置在web角色订阅的服务总线队列上,然后web角色通过HubContext调用将该消息转发给客户端 我的问题是:如何从工作者角色直接将此消息发送到连接的客户端?到目前为止,我考虑了3种方法: 将signalr配置为web角色,以

我在Azure云服务应用程序中有两个角色:web角色(此处为信号器连接)和工作者角色

web角色使用Azure service bus作为其扩展提供程序

在特定时间点,工作角色将发出特定事件。我想将此数据直接发送到连接到集线器的客户端

我当前的实现涉及工作者角色将消息放置在web角色订阅的服务总线队列上,然后web角色通过HubContext调用将该消息转发给客户端

我的问题是:如何从工作者角色直接将此消息发送到连接的客户端?到目前为止,我考虑了3种方法:

  • 将signalr配置为web角色,以便它们使用相同的servicebus主题。-这不起作用,因为工作角色实例从web角色的主题订阅中“窃取消息”。这似乎是最干净的方法,但配置是一个问题

  • 使用.Net客户端发送集线器消息-这并不理想,因为它会给web角色带来不必要的负载,并且与上述方法相比,服务总线消息的数量增加了一倍

  • 手动为主题编写一条与信号器兼容的消息-非常粗糙,无法接受破坏性更改

我知道团队目前正在为下一个版本重写scaleout,但这在某个时候可能吗

编辑:
我注意到,.

中支持这一点。我的配置问题似乎是第一种方法不起作用的原因。 然而,即使循环中的消息少了一条,该方法的端到端速度似乎也慢了(大约150毫秒)


在进行任何更改之前,我将等待并查看scaleout工作是否会对该方法带来任何改进。

您能否继续使用一个示例?我已经设置了信号器,集线器在两个角色中应该是相同的吗?我的集线器位于一个单独的程序集中,该程序集由web和worker角色项目引用。当初始化web角色中的信号时,RouteTable.MapHubs方法会自动拾取它们,并且ConnectionManager.GetHubContext()方法可以使用它们。干杯,我发现了同样的问题-所有角色之间必须共享同一个中心,因此在公共程序集中引用,并且必须至少注册一个集线器,否则它不会订阅服务总线。现在,当工作者角色在一组客户机上触发事件时,其他每个web角色都会将事件推送到该组中各自连接的客户机上。魔术