【问题标题】:SignalR lagging when deployed on cloud? | .Net CoreSignalR 在云上部署时滞后? | .Net 核心
【发布时间】:2020-04-02 15:53:03
【问题描述】:

背景:我正在开发一个类似于 Uber 的系统,具体来说,服务器通过他们的应用程序在两种类型的用户(例如司机和客户端)之间调解数据流通过连接到服务器的 SignalR 集线器。跟踪他们与服务器的连接状态是强制性的,并且该过程应尽可能即时。

他们的连接状态通过HashList<>() 为每种类型的用户(2 个列表)进行管理。只要用户连接(调用OnConnected()),就会向列表中添加一个条目,而只要用户断开连接(调用OnDisconnected()),就会从列表中删除该条目。

这些HashLists 是静态变量,遵循this StackOverflow answer 的联盟。

在我的机器上进行本地调试时,HashLists 会立即被修改,但是当在云服务(在我的情况下:Azure)上发布时,列表需要时间(大约 10 到 15 秒)才能更新。但是,获取与服务器的有效连接只需要大约 5 秒。

现在,我知道连接到服务器不可能是即时的,这取决于几个因素,其中大多数因素是我无法企及的,但立即(或尽可能即时)检测断开连接可以解决我的问题,我该怎么办?我应该采取不同的方法吗?

PS:可以在客户端立即检测断开连接,但这对我来说无济于事,因为我需要服务器中连接的用户数据。

【问题讨论】:

    标签: azure .net-core signalr cloud static-variables


    【解决方案1】:

    我相信您正在部署自己的 SignalR 服务。仅将内容存储在静态变量中是不够的,因为无法保证您的请求将被转发到同一台服务器。要解决这个问题,您需要实现自己的背板模式并将状态保存在其他地方。(例如 Azure Redis 缓存)

    更多信息:

    https://docs.microsoft.com/en-us/aspnet/signalr/overview/performance/scaleout-in-signalr

    https://docs.microsoft.com/en-us/aspnet/core/signalr/redis-backplane?view=aspnetcore-3.1

    PS:我强烈建议您使用 Azure SignalR 服务,而不是自己托管。

    【讨论】:

    • 我支持这个答案。使用 Redis 背板的横向扩展仅在开始销毁 Redis 实例之前进行。不幸的是,使用 Azure Redis,甚至无法查看 pubsub 对 Redis 实例施加的负载,因此在您开始看到 SignalR 性能严重滞后之前,您不会知道事情是否会偏离轨道。
    • 关于 Redis:我知道这将有助于用户连接到不同的服务器。但在我的情况下(开发阶段,用户数量最多为 2 或 3),假设他们都连接到同一台服务器,为什么变量需要很长时间才能更新?是静态变量的问题还是OnDisconnected 函数的瓶颈需要时间来调用?关于 SignalR 服务,我肯定会尝试一下,但同样,该应用仍处于开发阶段,我会看看免费计划是否适合我们。
    猜你喜欢
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多