棘轮多个服务器

dro*_*dil 5 php haproxy ratchet

我在我的PHP应用程序中将Ratchet(http://socketo.me/)用于websockets。我有多个运行该应用程序的虚拟机,每个虚拟机还托管websocket服务。通过HAProxy将请求传递到这些虚拟机之一。同样,当前用户还在为应用程序连接的同一节点上使用websocket服务。

现在我与websocket服务器互相讨论有问题。例如:

  • 用户1连接到节点1,用户2连接到节点2
  • User1通过websocket向用户2发送websocket消息
  • User2从未收到此消息,因为他已连接到另一个节点

进行此类消息传递的良好实践是什么?我有一些想法,但不确定该怎么走:

  1. 每个客户端都连接到每个websocket节点。
  2. 服务器也将消息发布到所有其他节点
  3. 使用数据库在节点之间同步消息

如果将新节点连接到云,则第一个和第二个选项的伸缩性都不太好。第三个选项将导致一些滞后,因为有必要检查来自其他节点的消息是否在数据库循环中。

还有其他选择来处理这种情况吗?感谢您的回答!

Mic*_*icz 0

只是一些注释可能会为人们指出一个可能的方向:

  • 您可以使用 Redis 作为一个非常快的数据库来实现列表 - rpush、llen、lrange。这将以令人惊讶的有效方式处理服务器之间的同步。
  • 不要直接在 onMessage 处理程序中发送消息,而是将消息直接放入 Redis 中。这样处理程序就超级快了。
  • 不要让 Ratchet 创建自己的循环,而是手动创建一个循环并在其上添加一个定期计时器来轮询 Redis 并向客户端发送新消息。