为什么使用ReactPHP、Ratchet和ZeroMQ实现的Websockets会在一段时间后停止广播?

8
我有一个小型的websocket服务器,运行在以下库之上:
  • ReactPHP,
  • Ratchet

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

代码基本上与教程中一样。事件循环正确启动,用户能够连接到服务器,当另一方push时,他们会收到正确的消息,但过一段时间后,通常是几天(取决于使用情况),消息就停止到达了。

使用并不会很多 - 目前只有一两个前端开发人员连接,因为这是开发阶段。

循环正在运行,连接上后返回HTTP 101切换协议,但不广播之前正确广播的消息。没有任何错误。重启事件循环可以解决问题。

我的问题是:

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

2) 您能推荐一种我可以调试事件循环长时间运行的方法吗?

目前,我必须停止循环,更改代码(添加日志调用),重新启动循环,然后等待它再次出错,这至少很繁琐。

任何帮助都将不胜感激。


1
欢迎来到分布式计算的世界。功能丢失/阻塞可能有很多原因。因此,您能否发布一个最小化的MCVE,用于(事件循环+客户端)对ZeroMQ基础设施设置的完整详细信息+异常处理(参数+传输类和正式通信模式/行为原型)在此项目中使用? - user3666197
思维要跳出常规,看起来某些资源池已经耗尽,例如:内存不足以分配新对象,或者网络连接数量不足以建立新连接,或者正在运行的 PHP 工作进程达到了最大数量(可能它们正在睡眠并等待输入)。考虑提出各种建议,并逐一排除它们。 - Anton Boritskiy
不要向我们展示任何代码,你最好的选择是检查所有错误日志,如果你的日志记录不够积极,那么你首先需要修复它。 - Jason
你是否正在使用任何类型的代理? - Pitchinnate
1个回答

0

嗯,我想 ZMQ 就是罪魁祸首。

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

因此,用户有时会从完全不同的应用程序收到 WebSocket 帧,当消息没有对应的用户时,帧就会在传递过程中消失。因此,Websockets 并没有停止广播,只是路由不正确。

我对 ZMQ 没有更大的了解,也不知道这是否是已记录或已知的行为。

我通过将后端重写为 RabbitMQ,并为每个应用程序设置单独的虚拟主机和通道来解决了问题。现在问题已经消失了,每个帧都到达了它应该到达的位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接