【问题标题】:Socket.io disconnects and reconnects in Angular applicationSocket.io 在 Angular 应用程序中断开连接并重新连接
【发布时间】:2021-02-11 13:02:03
【问题描述】:

我有一个 Angular 8 应用程序,它与 Node 后端通信并使用 socket.io-client 3.0.5 从后端(使用 socket.io 3.0.4)接收实时事件。操作如下:

  1. 当用户登录时,使用this.socket = io(API_URL) 打开一个新的套接字连接
  2. 有些 API 调用需要很长时间才能完成(超过 25 秒),因此它们不断通过 Web 套接字连接发出信息消息,因此我可以在前端更新视图。我们通过传递 channel_id 作为参数来做到这一点,这基本上是我们将要监听以获取消息的事件名称。
  3. 在下图中,我显示了执行 9 个“编译”调用的批处理的输出:

前 4 个调用运行良好,接收到所有套接字消息。然而,突然间,我看到来自 socket.io 库的一些调用(以?EIO=4&transport=polling 开头的那些)似乎取消了现有的 websocket 连接并开始一个新的连接,如下图所示(抱歉,socket id 与前一个不同,因为它是另一次运行):

我不对 API 调用之间的套接字连接做任何事情。代码执行以下操作:

  1. (在开始通话之前)创建一个channel_id 并使用this.socket.on(channelId, (event: any) => { ... }); 开始监听它
  2. 使用for循环使用上述channel_id进行API调用,一一进行
  3. 所有调用结束后,使用socket.off“取消订阅”套接字消息

我已经做了很多测试,但我找不到断开连接的原因,我不知道我还能查看什么。任何人都可以给我一些关于检查什么可以帮助我解决这个问题的建议?

非常感谢!

【问题讨论】:

    标签: angular socket.io


    【解决方案1】:

    经过一些测试,我发现问题不在 Angular 应用程序上,而是在后端。编译过程非常耗费 CPU,看起来,尽管所有内部逻辑都是用 Promise 完成的,但 Node 服务器会过载,无法完成其余任务。因此,当套接字“ping”消息到达时,服务器在接下来的 5 秒内无法响应,这被认为是连接丢失,因此它会尝试重新连接。

    我已经解决了在服务器启动时增加 ping 间隔和超时:

    const _io: io.Server = new io.Server(this._server, {
      pingInterval: 100000,
      pingTimeout: 90000,
    });
    

    这只是一个临时补丁,因为解决方案是利用 Node 的一些功能来处理 CPU 密集型任务,作为工作线程,但这是另一个问题;)

    干杯,

    【讨论】:

    • 不错。您是否尝试将连接对象存储在变量中并且变量连接对象的重用不为空?这样可以避免重试间隔。你的方式可能容易出现内存泄漏
    • 嗨!我们在Node服务器启动时创建socket io连接,并且对所有连接的用户保持相同,你是这个意思吗?
    • 好的。当客户端发出连接请求时创建新的套接字怎么样?客户端尝试连接时是否一直这样做?
    • 是的,当客户端登录时,我们使用this.socket = new io(API_URL) 创建一个新套接字。当用户注销时,我们关闭套接字连接。
    • 好酷。我猜应该没问题。每次客户端发送消息并执行循环并取消订阅时,我都认为或阅读过您创建或检查连接。如果您错过,此方法很容易泄漏
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 2021-04-12
    • 2013-11-21
    • 1970-01-01
    • 2012-10-12
    • 2014-04-30
    相关资源
    最近更新 更多