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

Fin*_*nwe 8 php zeromq websocket ratchet reactphp

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

  • ReactPHP,
  • 棘轮

  • ZeroMQ,使用php-zmq包装器.

代码与教程中的代码基本相同.

eventloop正确启动,用户可以连接到服务器,他们正在获取正确的消息,当另一方推送东西时,但过了一段时间,通常是几天(取决于使用情况)消息停止到达.

根本没有压倒性的使用 - 目前只有一两个前端开发人员连接,因为这是一个开发阶段.

循环正在运行,它在连接时正确返回HTTP 101切换协议,但不会广播之前正确广播的消息.没有任何错误.重新启动事件循环会有所帮助.

我的问题是:

1)是什么导致这种情况?有人遇到过类似的行为吗?

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

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

任何帮助非常感谢.

Fin*_*nwe 0

嗯,我猜 ZMQ 是罪魁祸首。

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

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

我对 ZMQ 以及这是否是有记录的或以其他方式已知的行为没有更多的了解。

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