通过 Amazon GameLift 托管多人游戏服务器 - 匹配和队列管理

介绍通过 GameLift 部署游戏服务器、FlexMatch 匹配以及 Spot 实例的活用方法。

GameLift 概述

GameLift 是一项以托管方式托管多人游戏专用服务器的服务,可在全球的 AWS 区域和 Local Zones 部署游戏服务器。为 FPS、大逃杀、MOBA 等实时多人游戏的玩家提供低延迟连接。通过 FlexMatch 匹配引擎根据技能等玩家属性组成比赛,通过 Auto Scaling 根据玩家数量自动调整服务器容量。将 GameLift Server SDK 集成到游戏服务器二进制文件后,GameLift 代为处理会话管理、健康报告和玩家连接管理,游戏开发者负责实现游戏逻辑。

FlexMatch 与队列管理

FlexMatch 是基于规则的匹配引擎,根据玩家的技能评分、延迟、队伍大小和自定义属性组成比赛。匹配规则以 JSON 定义,可设置「将技能差在 100 以内的玩家进行 5v5 匹配」等条件。规则可定义扩展(expansion),随着等待时间增加逐步放宽技能差异容许范围,平衡匹配成功率和质量。队列是游戏服务器的实例组,支持按需和 Spot 的混合配置。游戏会话队列跨多个队列管理游戏会话配置,可用于故障转移和考虑成本的放置。

多区域与延迟优化

GameLift 的多位置队列通过一个队列定义在多个区域部署游戏服务器。FlexMatch 的匹配设置评估玩家的延迟数据,决定放置游戏会话的区域。玩家通过 GameLift SDK 测量延迟并包含在匹配请求中。使用 Anywhere 队列可将本地或边缘服务器也纳入 GameLift 的统一管理,构建混合游戏基础设施。实时服务器功能允许使用 Node.js 脚本编写游戏逻辑,无需自定义二进制构建即可搭建轻量级游戏服务器。

设计最佳实践与陷阱

以下整理在 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。不过 GameLift 是 AWS 专有服务,追求多云策略或以本地为中心的运营时,采用 Anywhere 队列或其他方式。低负载的休闲游戏使用实时服务器,大量使用物理运算的 FPS 类游戏则采用自定义二进制方式。

GameLift 的成本优化

GameLift 按实例小时计费。在队列中指定 Spot 实例可降低托管成本。FleetIQ 选择 Spot 中断率低的实例类型。通过 Auto Scaling 策略根据活跃游戏会话数或玩家数调整队列大小,减少非高峰时段的实例数以降低成本。可采用按需与 Spot 混合队列构成,以按需确保基线容量,以 Spot 处理峰值追加容量。

总结

GameLift 是提供多人游戏服务器托管和 FlexMatch 匹配的服务。通过多位置队列在多个区域部署游戏服务器,通过 Spot 实例降低托管成本。通过 Anywhere 队列还可统一管理本地和边缘服务器,通过实时服务器构建轻量级游戏逻辑。

参考资料(AWS 官方)

本页的第一手信息来源是 AWS 官方网站及官方文档。最新的规格与价格请以下列官方页面为准。

如本页内容与官方文档不一致,请以官方文档为准。

分享