我们正在开发一个游戏化环境,以促进“无聊”材料的学习。最近,我们推出了包含以下模块的 1.0 版本:
- 用于学习课程、查看排行榜(评分)、个人活动和成就的基于 Django 的门户网站。
- 基于 Tornado 的实时提要和通知服务。我们使用的是mrjoes开发的sockjs -tornado。我们从共享会话中受益:如果用户登录到 django 站点,他会自动打开一个带有我们 Comet 后端的频道。
- 基于 Tornado 的异步多人游戏服务器。同样,我们使用sockjs-tornado连接和服务玩家(套接字),在网络上同步游戏循环事件。
现在,我正在研究系统的可扩展性和高可用性功能。主要挑战是在游戏集群节点之间正确且一致地分配负载(无数据丢失,在崩溃时进行故障转移,如果其中一个游戏服务器(循环)突然崩溃时重新平衡)。主要目标是使客户端与游戏的交互尽可能无缝:客户端不应执行其他操作:如果游戏因服务器故障而崩溃,则手动重新连接。该图描绘了分布式游戏服务器的可能架构。
如果在 Django 站点上的 .../game 上执行某些操作(CRUD 操作),基于龙卷风的游戏路由器会通过一种 oplog 集合(由游戏路由器跟踪的 mongodb 中的上限集合)实时通知。如果这是一个新游戏,Game Router 会通过特殊算法(最快的心跳行程,或直播(活动)游戏的最少数量)确定游戏的下一个主机(游戏服务器)。此外,游戏路由器通过向主题交换发布消息来通知适当的循环。
如果任何游戏服务器崩溃,Game Router 将立即收到通知,并通过在 memcached 集群中获取空闲游戏来重新平衡负载。
如果失败,客户端如何无缝重新连接到新的游戏服务器?我不想打开冗余通道(套接字连接)。我是否走对了路?请为我提供好的方法、批评者和技巧。如果您通过绘制图表来分享您的想法,那就太好了。
先感谢您。