如何动态扩容Dedicated Server

解读

在国内游戏上线周期短、流量峰值不可预测的背景下,“动态扩容” 已不仅是运维黑话,而是 Unity Dedicated Server(后简称 DS)架构的生死线。面试官问“如何动态扩容”,核心想验证三件事:

  1. 你是否把 DS 做成无状态、可横向切割的服务;
  2. 能否在分钟级甚至秒级完成实例拉起并注册到对战调度系统;
  3. 对国内云厂商(阿里云、腾讯云、华为云)的弹性伸缩组、镜像市场、按量计费套路是否熟悉。
    回答时务必把“扩容触发条件 → 镜像预热 → 实例拉起 → 业务可用 → 流量灰度 → 缩容回收”整条链路讲全,并给出 Unity 侧的具体配合点,否则会被认为“只懂 Docker 不懂游戏”。

知识点

  1. DS 无状态化:战斗逻辑不依赖本地持久化,玩家数据全部走 Redis + MySQL,实例挂掉可立刻漂移。
  2. 镜像分层:把 Unity Linux Headless Build、Mono 运行时、网络库、热更 DLL、地图预加载资源打成**“冷/热”两层镜像**,冷镜像 200 MB 以内,保证 30 s 内完成 CVM 拉起。
  3. 弹性伸缩组 AS(阿里云)/ 伸缩组(腾讯云):以**“CPU>70% 或房间数>80%”** 作为扩容指标,支持步长 5 台、冷却 60 s。
  4. Room TTL 与优雅下线:DS 进程收到 SIGTERM 后,先拒绝新房间创建,等存量房间 TTL=0 再退出,避免玩家被强制踢出。
  5. Unity 侧配合
    • 启动参数 -batchmode -nographics -dedicatedServer 读取环境变量 SERVER_PORTMATCH_LOGIC_ID,自动注册到对战调度中心(Matchmaking Dispatcher)
    • 使用Memory Profiler API 每 10 s 上报当前房间数、GC 内存、Packet Loss,供伸缩组决策。
  6. 国内云特色:阿里云支持**“抢占式实例”成本降低 70%,但 5 分钟强制回收,需提前把 DS 做成checkpoint 可迁移**;腾讯云**“竞价实例”**支持 2 分钟通知,适合凌晨缩容。
  7. 灰度与回滚:新镜像先灰度 10% 实例,通过战斗回放校验无异常后再全量,异常一键回滚到旧镜像并强制下线新实例。

答案

“我们在上线前就把 DS 做成完全无状态:战斗状态写 Redis、日志走 Kafka、资源全放 OSS,Unity Build 使用 Linux Headless,单实例可承载 20 间房。镜像分为两层:基础镜像只包含 Mono 和 so 库,保持在 180 MB;业务镜像通过 CCD 热更把 DLL 和地图资源挂载到 /hotfix,这样新逻辑发布只需替换热更层,无需重新打镜像。
扩容链路:

  1. 阿里云伸缩组监控**‘房间数>80% 或 CPU>70%’** 持续 1 分钟即触发,步长 5 台,冷却 60 s;
  2. 新实例从镜像市场拉取最新冷镜像,30 s 内完成启动,随后通过 User-Data 脚本拉取热更层,启动 Unity 进程并传入环境变量 MATCH_LOGIC_IDCLUSTER_ID
  3. DS 启动后调用对战调度中心的 /register 接口,上报 IP、端口、最大房间数,调度中心将其标记为‘可分配’;
  4. 网关层(ENI 弹性网卡)在 5 s 内把新实例加入四层 SLB 后端,玩家无感知;
  5. 当监控发现**‘空闲房间<10% 且持续 10 分钟’** 即触发缩容,伸缩组向 DS 发 SIGTERM,DS 拒绝新房间并等待 TTL=0,完成后回调 /unregister,弹性组释放按量实例。
    整个过程从触发到可分配平均 55 秒,峰值可支撑 5000 并发房间,成本比包年包月节省 42%。”

拓展思考

  1. 跨地域扩容:国内玩家分布广,若华北集群满负载,可借助阿里云全球加速 GA 把新 DS 起在华南,但延迟可能增加 30 ms,需动态调度**“就近分配 + 延迟补偿”**策略。
  2. State synchronization vs. Stateless:如果项目强依赖 Unity Physics 状态,完全无状态会牺牲一致性,可考虑**“半状态”方案:把确定性 Physics 种子、帧缓存放 Redis Stream,实例挂掉由新实例追帧恢复**,但需验证浮点确定性是否过关。
  3. K8s 化趋势:腾讯游戏云已推出**“GameServerFleet” CRD**,支持 Unity DS 以 Pod 形式运行,通过HPA on Custom Metrics 秒级伸缩;但国内云原生节点普遍缺 GPU,若项目用到了Unity Burst + GPU Skinning 需谨慎评估。
  4. 成本极限优化:把 DS 编译成IL2CPP + Linux ARM64,在阿里云倚天 710 实例上跑,单核可扛 25 间房,成本再降 35%,但需处理 ARM 下 SQLite P/Invoke 崩溃等坑。