1

现在我正在使用 PubNub 让我的网络应用程序进行通信。我有两个不同的应用程序通过 JS 接收消息(所以只是听)和至少三个不同的应用程序(两个 Web 和一个工作人员)发送消息(服务器到客户端)。

因此,对于 PubNub,事情非常简单,从代码隐藏我对他们的服务器进行休息调用,我的 JS 客户端接收消息。我想用 SignalR 复制它,但我需要检查我要使用的设计/架构。

我正计划创建一个运行 SignalR 服务器的 .Net Web 应用程序。这里我创建 Hub,在 Global.asax 中配置路由(RouteTable.Routes.MapHubs(new HubConfiguration() { EnableCrossDomain = true }))。这将部署在 sr.mydomain.com 上。

JS 客户端(部署为 client1.mydomain.com 和 clientx.mydomain.com)可以轻松监听 sr.mydomain.com 设置 $.connection.hub.url 发送的消息

到目前为止,一切都很好,编码,测试并且正在工作。

重点是如何从 webapp.mydomain.com 和 MyWorkerRole 向 JS 客户端发送消息。我正在考虑在 sr.mydomain.com 上创建一个可以从 webapp.mydomain.com 和 MyWorkerRole 使用的 webmethod。因此 MyWorkerRole 调用 sr.mydomain.com 上的 webmethod,sr.mydomain.com 将消息发送到 client1.mydomain.com。这有意义吗?有更好更直接的方法来做到这一点?

4

1 回答 1

1

您的方法将在单服务器模式下工作。如果您必须将 sr.mydomain.com 扩展到多个实例,那么明显的问题是信号器客户端可能未连接到接收 Web 服务调用的节点。

如果需要支持横向扩展,可以使用 SQL Server、Azure 服务总线或 Redis 作为背板。见:http ://www.asp.net/signalr/overview/signalr-20/performance-and-scaling/scaleout-in-signalr

50K 英尺的视图是这样的:

  1. 像往常一样创建从 SignalR Hub 派生的集线器。
  2. 在事件生产者(网络角色)和消费者端(您的工作角色等)上,初始化信号器以使用背板。当然,在 web 应用程序中,您可以将其Global.asaxMapHubs调用一起添加。

    GlobalHost.DependencyResolver.UseRedis(redisServer, redisPort, redisPassword, key);
    
  3. 在生产者端(工人角色),您可以获得IHubContext如下:

    var hubContext =
            GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
    

    现在您可以使用hubContext.Clients. 与扩展类似UseRedis,还有其他扩展,例如UseServiceBus

于 2013-11-14T03:40:30.740 回答