8

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

  • 反应PHP,
  • 棘轮

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

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

事件循环正确启动,用户能够连接到服务器,他们收到正确的消息,当对方推送一些东西时,但过了一段时间,通常几天(取决于使用情况)消息停止到达。

使用并没有压倒一切——目前只有一两个前端开发人员连接,因为这是一个开发阶段。

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

我的问题是:

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

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

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

非常感谢任何帮助。

4

1 回答 1

0

好吧,我猜 ZMQ 是罪魁祸首。

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

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

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

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

于 2017-03-21T13:22:45.880 回答