在Heroku上使用带有多个dynos的Node.js + Socket.io

时间:2016-03-22 02:27:32

标签: node.js heroku websocket socket.io dyno

我正在尝试使用Heroku上的Node / SocketIO构建实时多人游戏,并且我不确定如何处理多个dynos以共享SocketIO连接数据。

例如:

  1. 我有2个Heroku dynos,每个都运行Node + SocketIO
  2. 玩家A主持游戏,而dyno 1处理该连接
  3. 玩家B尝试加入同一游戏,但由于Heroku路由器,dyno 2最终处理该连接。
  4. 游戏中的动作需要实时发生,因此当玩家A执行动作时,玩家B需要立即看到该动作的结果。
  5. 在单动态环境中,这会相对简单。当玩家A执行一个动作时,它只会被发射到玩家B.当有多个动作时,它会如何工作?

1 个答案:

答案 0 :(得分:1)

由于您无法选择(或知道)您要连接的Heroku dyno(web.1web.2web.n),因此您需要找到另一个在许多动态游戏中传达游戏变化的方式。

执行此操作的一种方法是另外使用分布式消息传递服务来传达游戏中的更改。使用分布式publush-subscribe体系结构Player A可以将游戏中的动作发送到dyno 1,然后dyno 1将它们放在队列中。

当玩家B加入游戏时,Dyno 2可以订阅到游戏队列。现在,Dyno 2将从游戏中接收动作,然后能够通过套接字将它们发送给玩家B.

虽然这种方法的延迟不会像单个高性能服务器那样低,但如果您希望获得扩展和冗余的好处,可能需要这样的方法。

在Heroku上,您可以考虑使用Redis来实现此目的,因为Heroku提供了托管版本,并且它适用于低延迟应用程序。