2015-02-12 79 views
4

我在我的PHP应用程序中使用棘轮(http://socketo.me/)用于websockets。我有多个运行该应用程序的虚拟机,并且这些机器中的每一台也承载websocket服务。通过HAProxy将请求传递给其中一台虚拟机。目前,用户还在与应用程序连接的同一节点上使用websocket服务。棘轮多台服务器

现在我遇到了一个websocket服务器相互讨论的问题。 例如:

  • USER1连接到节点1和用户2连接到节点2
  • 用户1通过网页套接字发送的WebSocket消息给用户2
  • 因为他被连接到另一个节点
用户2从未得到此消息

做这种消息的最佳做法是什么?我有一些想法,但不知道要走什么路线:

  1. 每个客户端连接到每个websocket节点。
  2. 服务器发布消息到所有其他节点以及
  3. 使用数据库节点

如果新节点连接到云这两个第一和第二选项是不是很可扩展性之间的消息同步。第三个选项会导致一些延迟,因为有必要检查来自其他节点的消息是否在数据库循环中。

有没有其他的选择来处理这种情况?感谢您的答案!

回答

0

就在几个音符可能指向人在一个可能的方向:

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