【问题标题】:Using Node.js + Socket.io on Heroku with multiple dynos在带有多个测功机的 Heroku 上使用 Node.js + Socket.io
【发布时间】:2016-07-08 19:06:15
【问题描述】:
我正在尝试在 Heroku 上使用 Node / SocketIO 构建一个实时多人游戏,但不确定如何处理多个 dynos 以共享 SocketIO 连接数据。
例如:
- 我有 2 个 Heroku dyno,每个都运行 Node + SocketIO
- 玩家 A 主持游戏,dyno 1 处理该连接
- 玩家 B 尝试加入同一个游戏,但由于 Heroku 路由器,dyno 2 最终处理了该连接。
- 游戏中的动作需要实时发生,因此当玩家 A 执行某个动作时,玩家 B 需要立即看到该动作的结果。
在单测功机环境中,这将相对简单。当玩家 A 执行一个动作时,它会简单地发送给玩家 B。如果有多个测功机,这将如何工作?
【问题讨论】:
标签:
node.js
heroku
websocket
socket.io
dyno
【解决方案1】:
由于您无法选择(或知道)您要连接的 Heroku dyno(web.1、web.2 或 web.n),因此您需要找到另一种方式来传达跨多个 dynos 的游戏。
一种方法是另外使用一个分布式消息服务来传达游戏中的变化。使用分布式发布-订阅架构,玩家 A 可以将游戏中的动作发送到 dyno 1,然后将它们放入队列中。
当玩家 B 加入游戏时,
Dyno 2 可以订阅游戏队列。现在,Dyno 2 将接收来自游戏的动作,然后能够通过套接字将它们发送给玩家 B。
虽然这种方法的延迟不会像单个高性能服务器那样低,但如果您想获得扩展和冗余的好处,可能需要类似的方法。
在 Heroku 上,您可能会考虑为此使用 Redis,因为 Heroku 提供托管版本,并且它在低延迟应用程序中表现良好。