通过 Amazon GameLift 托管多人游戏服务器 - 匹配和队列管理
介绍通过 GameLift 部署游戏服务器、FlexMatch 匹配以及 Spot 实例的活用方法。
GameLift 概述
GameLift 是一项以托管方式托管多人游戏专用服务器的服务,在全球 15 个以上区域提供低延迟连接。为 FPS、大逃杀、MOBA 等实时多人游戏的玩家提供低延迟连接。通过 FlexMatch 匹配引擎实现基于技能的匹配,通过 Auto Scaling 根据玩家数量自动调整服务器容量。将 GameLift Server SDK 集成到游戏服务器二进制文件后,GameLift 代为处理会话管理、健康报告和玩家连接管理,使游戏开发者专注于游戏逻辑实现。
FlexMatch 与队列管理
FlexMatch 是基于规则的匹配引擎,根据玩家的技能评分、延迟、队伍大小和自定义属性组成比赛。匹配规则以 JSON 定义,可设置「将技能差在 100 以内的玩家进行 5v5 匹配」等条件。规则可定义扩展(expansion),随着等待时间增加逐步放宽技能差异容许范围,平衡匹配成功率和质量。队列是游戏服务器的实例组,支持按需和 Spot 的混合配置。Spot 实例中断时,GameLift 自动将玩家会话迁移到其他服务器。游戏会话队列跨多个队列管理游戏会话配置,为故障转移和成本优化提供更大灵活性。
多区域与延迟优化
GameLift 的多位置队列通过一个队列定义在多个区域部署游戏服务器。FlexMatch 的匹配设置评估玩家的延迟数据,将游戏会话放置在延迟最低的区域。玩家通过 GameLift SDK 测量延迟并包含在匹配请求中。使用 Anywhere 队列可将本地或边缘服务器也纳入 GameLift 的统一管理,构建混合游戏基础设施。实时服务器功能允许使用 Node.js 脚本编写游戏逻辑,无需自定义二进制构建即可搭建轻量级游戏服务器。 GameLift 的体系化学习可参考相关书籍 (Amazon)。
设计最佳实践与陷阱
以下是 GameLift 生产运营的关键设计要点。Server SDK 集成时,必须在 ProcessReady 中正确实现 onStartGameSession、onProcessTerminate、onHealthCheck 三个回调。onHealthCheck 返回 false 时,进程被判定为异常并被终止。游戏会话的最大同时玩家数在 CreateGameSession 时指定,中途无法更改,需留有余量。使用 Spot 实例时,从 onProcessTerminate 被调用到进程结束通常有 2 分钟缓冲时间,需在此期间完成游戏状态保存和玩家通知。游戏会话队列建议优先配置 Spot 队列,将按需队列作为后备。此外,GameLift 的构建上传需按区域执行,应在 CI/CD 管道中自动化向所有目标区域的部署。
与其他托管方式的比较
多人游戏服务器托管方式除 GameLift 外,还有 EC2 自运维、ECS/EKS 容器化以及第三方的 Multiplay 和 i3D.net。EC2 自运维获得完全控制权,但需自行构建匹配、扩缩容和会话管理的全部功能,运维负担极高。ECS/EKS 的容器化优势在于可移植性,但游戏专用匹配和基于延迟的放置逻辑需独立实现。GameLift 集成了 FlexMatch、FleetIQ、多位置队列等所有游戏专用功能,显著降低游戏开发团队的基础设施运维工时。不过 GameLift 是 AWS 专有服务,追求多云策略或以本地为中心的运营时,Anywhere 队列或其他方式更合适。实时服务器适合低负载的休闲游戏,但对于大量使用物理运算的 FPS 类游戏,自定义二进制方式不可或缺。
GameLift 的成本优化
GameLift 按实例小时计费。在队列中指定 Spot 实例可实现最高 70% 的成本削减。FleetIQ 自动选择 Spot 中断率低的实例类型,最小化游戏会话中断。通过 Auto Scaling 策略根据活跃游戏会话数或玩家数调整队列大小,减少非高峰时段的实例数以降低成本。推荐按需与 Spot 混合队列构成,以按需确保基线容量,以 Spot 处理峰值追加容量。
总结
GameLift 是提供多人游戏服务器托管和 FlexMatch 匹配的服务。通过多位置队列自动为玩家选择延迟最低的区域,通过 Spot 实例实现最高 70% 的成本削减。通过 Anywhere 队列还可统一管理本地和边缘服务器,通过实时服务器构建轻量级游戏逻辑。