代码之家  ›  专栏  ›  技术社区  ›  Devator

信号器核心-失效死连接

  •  5
  • Devator  · 技术社区  · 6 年前

    问题

    this document ;尽管这是“旧”信号器库的手册,但逻辑是相同的)。我还使用Redis背板,因为我的应用程序可以水平扩展。

    但是,当重新启动我的应用程序时,当前的连接不会关闭,并且会成为孤立的。先前链接的文章指出:

    未调用OnDisconnected方法。因此,有可能 您的数据存储库中的连接ID的记录不是 有效期更长。要清理这些孤立的记录,您可能希望 使在时间范围之外创建的任何连接失效

    ITransportHeartbeat this script 完美的实现),但是对于.NET核心版本没有这样的接口(至少,我找不到)。

    我如何知道连接是否已失效?我想(或实际上需要)清理旧的连接id。

    1 回复  |  直到 5 年前
        1
  •  5
  •   Devator    6 年前

    我想出的解决方案如下。虽然没有那么优雅,但目前我看不到其他选择。

    我更新了数据库中的模型,使其不仅包含 ConnectionId LastPing (这是一个 DateTime KeepAlive 消息(自定义消息,不使用信号器keepalive设置)。收到消息后(服务器端),我用当前时间更新数据库:

    var connection = _context.Connection.FirstOrDefault(x => x.Id == Context.ConnectionId);
    connection.LastPing = DateTime.UtcNow;
    

    清理孤立的连接(信号机不会移除这些连接 OnDisconnected 方法)中,我有一个任务定期运行(当前在Hangfire中),该任务将删除 拉丝 字段最近未更新。