2015-10-22 58 views
1

我们在大型Web应用程序中使用SignalR。我们部署了多个处理signalR连接的Web服务器。我们有我们自己的Redis背板,我有以下问题: SignalR对服务器进行三次调用:1)协商,2)连接和3)启动。如果我们在Load Balancer后面有一个Web场,并且这三个调用最终会连接到三台不同的服务器,那么连接状态是否会在所有三台服务器上损坏?在这种情况下会发生什么?我不是在谈论消息传递。Web农场中的SignalR连接管理

更具体地说:

  1. 会第二web服务器能够理解通过谈判调用生成的的ConnectionId ?

  2. 在物理连接(的WebSockets)是在不同的服务器上建立 ,然后开始通话转到另一个 服务器会发生什么?

我知道SignalR没有传达服务器之间的连接信息。我想知道这三台服务器的内存连接状态。 我读了与此相关的另一个问题,但它只谈论消息传递。对我们来说,信息传递不是问题。如果这三个调用最终转到不同的服务器,我想了解连接的最终状态。

,我已经经历得到答案的问题: SignalR connection affinity in web-farm scenario

由于我们的负载均衡器保持粘性,我无法确认什么时候会发生粘性消失。我想为这种可能性做好准备。

+0

嘿guruprasath,只是想知道如果你得到的回答这个问题?目前,我们有一个服务于该应用程序的服务器场,我们使用的是Azure中托管的Redis背板。在我的情况下,负载平衡器没有粘性会话,我看到超时并断开与websocket,我相信这是你所担心的。我感到困惑的部分是基于我在文档中读到的内容,传输连接直接与背板连接,这意味着负载均衡器没有什么区别......但我们没有看到单个节点环境的问题。 – ammills01

+0

@ ammills01,我没有得到答案。我尝试在另一个jabber频道发帖,但没有运气。根据你所描述的,我猜你的问题与粘性无关。我们使用我们自己的Redis集群来定制背板。所以,我无法谈论他们提供的Redis背板的稳定性。我的理解是,传输连接不是背板(这将是一个安全问题)。传输连接与前端Web服务器支持websockets。所以,负载平衡器的粘性可能很重要。 – guruprasath

+0

感谢您的回复。在进一步挖掘之后,我得出了与此处提到的相同的结论,传输是在SignalR服务器上进行的,因此请求中没有粘滞的会话就会反弹并失败。当发生这种情况时,你会得到超时,如果你配置了longPolling或其他传输技术,当你建立你的SignalR连接时,它将会故障转移到其中一个。对我们来说,它击中longPolling并且应用程序似乎可以正常工作,只需要更多的服务器资源。 – ammills01

回答

0

老问题,但我抽出时间来回答,因为我有一个类似的设置,尽管有不同的技术。它可能不能完全解决你的问题,但我认为可以画出很多相似的东西。

我们的场景中实时通信(即聊天消息)。当其他用户登录时,断开连接,服务器将随时通知客户端等

下面

技术堆栈:

客户:AngularJS应用

CDN:提供静态资源(HTML,CSS,图像)

负载均衡器:安装在Azure中

多的WebApp:运行ASP.NET的核心

多个SQL Server数据库:镜像

这里的关键点是应用程序保持整个无状态的。在任何时候,客户端可以断开/重新连接,并检索它在断开连接之前所具有的同一组信息。

  • 用户使用令牌机制进行身份验证(本例中为OAuth)。所有的用户信息(用户标识等)都被加密。

  • 建立连接并路由到正在运行的任何一个Web应用程序。

  • Webapp将连接信息存储在数据库表中。

  • Webapp检索在数据库中有连接的用户的所有“朋友”。

  • Webapp将列表发送回客户端。

  • 每当用户断开连接时,webapp都会收到断开连接事件并删除记录表单数据库。

  • 当用户重新连接时,webapp将连接添加回来,并向用户发送当前在线连接/客户端列表。

客户端需要维护它的状态以及如何对客户端列表中的更新做出反应。

此方法与您在问题中发布的答案中提到的方法类似。

我相信这里的基本概念是背板。它坚持了状态,而不是仅仅围绕服务器进行通信。

这里一个相关的博客文章可能有帮助:https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/mapping-users-to-connections

(在“多台服务器”的情景看看)

+0

在背板上多读一点答案,我相信这个概念是一样的。我已经给出了我的方法大纲。很明显,我们已经做了优化,例如在每次请求后使用新连接的客户端列表进行响应,而不是整个列表(您的文章中提到的光标事件)。 – l3utterfly