用SignalR替换PubNub - 设计帮助

时间:2013-07-16 10:22:07

标签: signalr

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

所以,使用PubNub很简单,从代码隐藏开始,我会对其服务器进行休息调用,而我的JS客户端会收到消息。我想用SignalR复制这个,但是我需要检查一下我将要使用的设计/架构。

我打算创建一个运行SignalR服务器的.Net网络应用程序。在这里我创建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中使用的web方法。因此,MyWorkerRole会在sr.mydomain.com上调用webmethod,而sr.mydomain.com会将消息发送到client1.mydomain.com。这有道理吗?还有更直接的方法吗?

1 个答案:

答案 0 :(得分: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