Web场方案中的SignalR连接关联

时间:2014-02-19 23:08:55

标签: javascript asp.net websocket signalr

我对我的应用程序有以下要求:在JavaScript(客户端)和服务器(ASP.NET)之间打开连接。此连接必须能够将数据发回&在中等时间内保持有状态(与REST调用不同)直到它关闭。也就是说,在连接期间,客户端基本上与服务器具有亲缘关系(在Web场方案中)。

我已经阅读了很多关于SignalR和WebSockets的内容,但我无法弄清楚这是不是它的运作方式。

我不关心web-farm中服务器之间的服务器与服务器通信,因为这已经通过代码解决了。我只需要JS客户端和它最初联系的服务器在连接期间保持联系。

这是如何工作的,如果没有,这可能吗?此外,如果可能,如何在多个呼叫/广播的连接期间将信息存储在内存中?

1 个答案:

答案 0 :(得分:7)

请记住,尽管SignalR为您提供了许多透明的东西,但4种底层传输却完全不同。

只有WebSockets和SSE是持久连接。 ForeverFrame和LongPolling是重复的HTTP请求,因此如果您有多个服务器以循环方式进行负载平衡,则无法控制每次调用的位置。

解决方案是使用具有粘性会话的负载均衡器。这种负载均衡器将在HTTP请求中查找特定的cookie,以便为特定服务器设置关联。

其他解决方案是使用SignalR背板,因此您不介意请求的位置,背板可确保连接获得正确的消息:

http://www.asp.net/signalr/overview/signalr-20/performance-and-scaling/scaleout-in-signalr

  

每个服务器实例通过总线连接到背板。当一个   消息被发送,它进入背板,背板发送它   到每个服务器。当服务器从背板获取消息时,它   将消息放入其本地缓存中。然后服务器传递消息   从本地缓存到客户端。

     

对于每个客户端连接,客户端的阅读进度   使用游标跟踪消息流。 (光标代表一个   在消息流中的位置。)如果客户端断开然后   重新连接,它要求总线提供之后到达的任何消息   客户端的游标值。连接使用时会发生同样的事情   长期民意调查。在长轮询请求完成后,客户端将打开一个   新连接并询问光标后到达的消息。