用 AWS Lambda MicroVMs 快速部署多人游戏服务器:让 Colyseus 实时服务”无服务器化”

用 AWS Lambda MicroVMs 快速部署多人游戏服务器:让 Colyseus 实时服务”无服务器化”

💡 原文中文,约9000字,阅读约需22分钟。
📝

内容提要

本文介绍如何将Colyseus多人游戏服务器部署到AWS Lambda MicroVMs上,实现无服务器化。方案通过MicroVM常驻进程支持WebSocket长连接、状态同步和主动广播,空闲时自动挂起节省成本。浏览器客户端经HTTP代理获取token并匹配,游戏数据直连MicroVM。文中详述部署流程、连接机制、最佳实践及成本考量,使游戏服务器兼具常驻能力与无服务器按需付费优势。

🔎

延伸解读

为什么需要两条连接通道

MicroVM 要求每个请求都携带 X-aws-proxy-auth 头,但浏览器无法为所有请求附加自定义头。HTTP 匹配请求会触发 CORS 预检,预检无法携带该头,因此必须走同源代理由服务端注入。而 WebSocket 升级没有预检,可以直连,但浏览器 WebSocket API 不能设置请求头,所以通过子协议传递 token 和端口。理解这一机制是部署成功的关键。

token 安全与刷新策略

token 最长 60 分钟过期,且不应写入前端包或 config.json。示例中 config.json 只存 endpoint、microvmId 和 region,客户端在连接前向 /_mm/token 拉取新鲜 token,服务端用 CreateMicrovmAuthToken 现签并按 microvmId 缓存,提前约 5 分钟刷新。这样即使实例长时间运行或重启,客户端也不会拿到失效 token 导致 403。

成本与实例生命周期管理

MicroVM 按占空比计费:运行中按秒计费,空闲超过 maxIdleDurationSeconds(示例 30 分钟)后挂起,仅付快照存储费,有流量自动恢复;挂起满 1 小时终止,终止后零成本。对长尾型游戏非常划算,但持续高并发时常驻实例可能更便宜。注意单实例最长 8 小时,长寿命房间需规划迁移或重启策略。

挂起恢复与重连注意事项

空闲挂起会断开所有活跃 WebSocket,客户端应监听断连并自动重连,重连时重新拉取 token。服务端可利用 /suspend 和 /resume hook 持久化与恢复房间状态。此外,镜像构建角色的信任主体必须是 lambda.amazonaws.com,而非 microvms.lambda.amazonaws.com,否则会被拒绝。

Q&A

AWS Lambda MicroVMs 是什么?它如何支持常驻进程?

AWS Lambda MicroVMs 是由 Firecracker 驱动的隔离沙箱,每个实例都有完整的操作系统,可常驻最长 8 小时,空闲时自动挂起(快照),有流量时近秒级恢复。它支持进程常驻、内存/磁盘保留,适合运行游戏服务器等有状态负载。

如何将 Colyseus 游戏服务器部署到 AWS Lambda MicroVMs?

首先克隆示例仓库并安装依赖,然后运行 `npm run deploy`,该命令会自动完成:确保 S3 桶和 IAM 角色存在、打包上传 server/、调用 CreateMicrovmImage 构建镜像(约1-2分钟)、调用 RunMicrovm 启动实例并等待 RUNNING,最后将实例坐标写入 config.json。

为什么浏览器客户端需要两条连接通道来连接 MicroVM?

因为 MicroVM endpoint 要求每个请求都携带 X-aws-proxy-auth 头,但浏览器无法为所有请求类型附加自定义头。HTTP 匹配请求会触发 CORS 预检,预检请求带不了鉴权头,所以需要走同源代理注入头;而 WebSocket 升级没有预检,可以直接连接,但浏览器 WebSocket API 不能设置请求头,所以通过子协议传递 token 和端口。

在 AWS Lambda MicroVMs 上运行 Colyseus 时,如何处理 token 的刷新?

token 最长 60 分钟过期,不应写入构建产物。客户端在连接前向 /_mm/token 拉取新鲜 token,服务端用 CreateMicrovmAuthToken 现签并按 microvmId 缓存,提前约 5 分钟刷新。这样即使 MicroVM 长时间运行或重启,客户端也不会拿到失效 token。

AWS Lambda MicroVMs 的成本是如何计算的?

MicroVM 计费跟随占空比:运行中按秒计费;空闲超过 maxIdleDurationSeconds(如30分钟)后挂起,仅付极低的快照存储费,有流量自动恢复;已终止则零成本。因此适合长尾型游戏,对持续高并发的热门游戏,常驻实例可能更便宜。

部署 Colyseus 到 MicroVM 时有哪些最佳实践?

最佳实践包括:token 仅在运行时签发,不写入前端包;客户端监听断连并自动重连,服务端利用 /suspend 和 /resume hook 持久化状态;8 小时上限需要轮换策略;按房间人数选择实例尺寸避免带宽瓶颈;支持多游戏时在 config.json 维护映射表;生产环境将 HTTP Proxy 置于 API Gateway 或 ALB 之后。

如何清理 AWS Lambda MicroVMs 资源以避免持续计费?

运行 `npm --prefix deploy run terminate` 终止实例。如需彻底清理,删除构建的镜像、S3 桶中的构建包和 IAM 角色。注意:删除镜像前必须先终止所有在跑的 MicroVM,否则会报错。

🏷️

标签

➡️

继续阅读