我们在大型Web应用程序中使用SignalR。我们已经部署了多个处理signalR连接的Web服务器。我们有自己的Redis背板,我有以下问题: SignalR对服务器进行三次调用:1)协商,2)连接和3)启动。如果我们在Load Balancer后面有一个Web场,并且这三个调用最终会转到三个不同的服务器,那么三个服务器上的连接状态是否会被破坏?在这种情况下会发生什么?我不是在谈论消息传递。
更具体地说:
第二个网络服务器是否能够理解connectionId 通过谈判电话制作?
建立物理连接(websockets)时会发生什么 在另一台服务器上,然后启动呼叫转到另一台服务器 服务器
我知道SignalR不会在服务器之间传递连接信息。我想知道这三台服务器的内存连接状态。 我阅读了与此相关的另一个问题,但它只涉及消息传递。对我们来说,邮件传递不是问题。如果这三个调用最终进入不同的服务器,我想了解连接的最终状态。
我已经通过以获得答案的问题: SignalR connection affinity in web-farm scenario
由于我们的负载平衡器保持粘性,我无法确认当粘性消失时会发生什么。我想为这种可能性做好准备。
答案 0 :(得分:0)
老问题,但是我花时间回答是因为我有类似的设置,尽管技术不同。它可能无法完全解决您的问题,但我认为可以得出很多相似之处。
我们的场景实时通信(即聊天消息)。当其他用户登录,断开连接等时,服务器将随时通知客户端
下面的技术堆栈:
客户:AngularJS App
CDN:提供静态资源(HTML,CSS,图像)
负载均衡器:在Azure中设置
多个WebApps:运行ASP.NET Core
多个SQL Server数据库:镜像
这里的关键点是应用程序始终保持无状态。在任何时候,客户端都可以断开/重新连接并检索断开连接之前的相同信息集。
使用令牌机制(在我们的示例中为OAuth)对用户进行身份验证。所有用户信息(用户ID等)都以令牌加密。
建立连接,并将其路由到正在运行的任何一个网络应用。
Webapp将连接信息存储在数据库表中。
Webapp检索所有"朋友"在数据库中有连接的用户。
Webapp将列表发送回客户端。
每当用户断开连接时,webapp都会收到disconnect事件并删除记录表单数据库。
当用户重新连接时,webapp会重新添加连接,并向用户发送当前的在线连接/客户端列表。
客户端需要维护它所处的状态以及如何对客户端列表中的更新做出反应。
此方法类似于您在问题中发布的答案中提到的方法。
我认为这里的基本概念是背板。它会持续存在状态,而不是仅仅在服务器周围进行通信。
此处的相关博文可能有所帮助:https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/mapping-users-to-connections
(看看"多个服务器"场景)