gpt4 book ai didi

网络场中的 SignalR 连接管理

转载 作者:行者123 更新时间:2023-12-02 15:29:28 25 4
gpt4 key购买 nike

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

更具体地说:

  1. 第二个网络服务器是否能够理解connectionId由协商调用产生?

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

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

我已经经历过以获得答案的问题: SignalR connection affinity in web-farm scenario

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

最佳答案

老问题,但我花时间回答,因为我有类似的设置,尽管采用不同的技术。它可能无法完全解决您的问题,但我认为可以得出很多相似之处。

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

技术堆栈如下:

客户端:AngularJS 应用程序

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

负载均衡器:在 Azure 中设置

多个 WebApp:运行 ASP.NET Core

多个 SQL Server 数据库:镜像

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

  • 使用 token 机制(在我们的例子中为 OAuth)对用户进行身份验证。所有用户信息(用户 ID 等)均在 token 中加密。

  • 连接已建立,并路由到任一正在运行的网络应用程序。

  • Web 应用程序将连接信息存储在数据库表中。

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

  • Web 应用程序将列表发送回客户端。

  • 每当用户断开连接时,Web 应用程序都会收到断开连接事件并删除数据库中的记录。

  • 即使用户重新连接,Web 应用程序也会重新添加连接,并向用户发送当前的在线连接/客户端列表。

由客户端来维护其所处的状态以及如何对客户端列表中的更新使用react。

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

我认为这里的基本概念是背板。它保留状态,而不仅仅是在服务器之间进行通信。

此处的相关博客文章可能会有所帮助:https://learn.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/mapping-users-to-connections

(看一下“多个服务器”场景)

关于网络场中的 SignalR 连接管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33271355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com