为什么 websockets 在一段时间后停止广播? (实现使用 ReactPHP、Ratchet 和 ZeroMQ)

Why websockets stop broadcasting after some time? ( implementation uses ReactPHP, Ratchet & ZeroMQ )

我有一个小型 websocket 服务器,运行 在一组库之上:

代码与教程基本一致

eventloop 正确启动,用户能够连接到服务器,他们收到正确的消息,当对方 pushes 一些东西,但过了一会儿,通常是几天(取决于使用情况)消息停止到达。

使用率一点也不高 - 目前只有一两个前端开发人员连接,因为这是一个开发阶段。

循环是 运行,它 returns HTTP 101 切换协议正确连接,但不广播之前正确广播的消息。任何地方都没有错误。重新启动事件循环有帮助。

我的问题是:

1) 这是什么原因造成的?有人遇到过类似的行为吗?

2) 你能推荐一种我可以在事件循环的长 运行 过程中调试它的方法吗?

目前,我必须停止循环,更改代码(添加日志记录调用),重新启动循环并等待它再次出错,这至少是乏味的。

非常感谢任何帮助。

嗯,我猜 ZMQ 是罪魁祸首。

当同一台机器上有多个应用程序使用 ZMQ 时,消息有时会到达错误的消费者 - 即使每个应用程序都指定了不同的端口来连接到 ZMQ 套接字。

因此,用户有时会从完全不同的应用程序获取 websocket 帧,当消息没有对应的用户时,该帧会在途中消失。所以 websockets 并没有停止广播,消息只是被错误地路由了。

我对 ZMQ 了解不多,也不知道这是记录在案的行为还是已知行为。

我通过为每个应用程序使用单独的虚拟主机和通道将后端重写为 RabbitMQ 解决了这个问题。现在问题都解决了,每一帧都在它应该的地方结束。