将游戏逻辑拆分为微服务
解读
国内面试官问“把游戏逻辑拆成微服务”,并不是让你把《王者荣耀》的帧同步战斗直接搬到 Docker 里。他想知道三件事:
- 你清楚 Unity 主线程的实时性要求(16 ms 一帧,不能阻塞);
- 你能区分“必须放在客户端”与“可以放在服务端”的边界,并给出可落地的拆分方案;
- 你熟悉国内运维现状——阿里云、腾讯云、Kubernetes、Istio、灰度、热更、版号合规、弱网优化、防沉迷接口,这些都要闭环。
一句话:把对实时性不敏感、需要水平扩展、需要跨端复用的逻辑拆出去,让 Unity 只做“表现+强交互”,其余用微服务 + 消息队列 + 网关搞定。
知识点
- Unity 主线程模型:单线程 + 帧循环,任何阻塞 IO 都会直接卡帧。
- ECS + 状态同步:客户端只表现,服务端跑权威逻辑;拆微服务时不能破坏“服务端权威”。
- 国内热更合规:iOS 不允许 Lua/JIT,Android 可以用 Lua、ILRuntime、HybridCLR;微服务侧用 C# + .NET 6/8 容器化,方便与客户端共享协议 DLL。
- 网络协议选型:对外 HTTP/HTTPS + Protobuf、对内 gRPC + HTTP/2,弱网场景再配 QUIC。
- 微服务粒度:按“领域”拆,不按“玩法”拆;例如“背包服务”“匹配服务”“赛季服务”,避免过度拆分导致分布式事务爆炸。
- 数据一致性:游戏经济系统必须最终一致 + 幂等 + 对账,使用腾讯云 TDSQL 或阿里云 PolarDB 的强一致事务插件。
- 灰度与回滚:用 Kubernetes 的 Deployment + ConfigMap + 镜像版本做金丝雀发布,客户端通过服务发现 + 配置中心(Nacos/Apollo)动态切流。
- 性能监控:客户端埋点 Unity Profiler + Sentry,服务端用腾讯云 APM 或阿里云 ARMS,关键接口 P99 latency < 100 ms。
答案
“拆微服务的第一步是划定边界。Unity 端只保留渲染、输入、预测、表现回放;所有带状态、需持久化、需跨端复用的逻辑全部外移。
以我们上线的一款 5v5 休闲竞技为例,拆分如下:
-
战斗服(Realtime Server)
用 C++ 基于 libuv 写帧同步进程,单局 10 人,UDP 直连,不经过微服务网关,保证 60 Hz 心跳;一局结束把对局快照 + 战报通过消息队列(Kafka)扔给后续服务。 -
业务微服务(.NET 8 + Docker)
- 背包服务:负责道具、皮肤、货币;用 gRPC + Protobuf,接口 Get/Update/Consume 全部幂等,数据库用 TDSQL MySQL 版,分库按 UID 取模。
- 赛季服务:计算段位、排行榜、发奖;定时任务跑在 Kubernetes CronJob,发奖接口内部做**分布式锁(Redisson)**防重复。
- 通行证服务:独立出来是为了版号合规,所有付费内容配置走外网不可见 CDN,接口返回已购列表,客户端本地校验。
- 防沉迷服务:对接腾讯实名 API,微服务侧缓存 15 min,避免每次对局都调公安接口。
-
网关与治理
用 Istio IngressGateway 统一暴露 443 端口,内部服务全部 mTLS;限流用阿里云 Sentinel,按 UID 维度做令牌桶,突发活动时可动态 QPS 翻倍。 -
热更与回滚
微服务镜像 tag 与客户端版本解耦,通过 Nacos 配置中心下发“兼容列表”,老客户端调新服务时走适配层 Facade,保证强制更新前可回滚。 -
性能结果
上线后,背包接口 P99 从 180 ms 降到 45 ms;赛季结算任务 30 min 缩短到 5 min;Unity 端帧率提升 8 %,因为把背包遍历、通行证校验全部移走,主线程每帧减少 2 ms CPU 耗时。”
拓展思考
-
Serverless 是否适合游戏?
国内云厂商已推出 游戏 Serverless 容器(如腾讯云 GSE),可 0 到 1 秒级拉起对战进程,适合低峰期匹配不到人的场景;但冷启动 300 ms 对 FPS 仍不可接受,需预热池 + 闲时计费策略。 -
微服务拆分过头怎么办?
出现“分布式单体”——网络调用比本地函数多 10 倍。解决思路:- 用 DDD 聚合根重新梳理,高内聚、低耦合;
- 对强一致场景合并服务,弱一致场景再拆;
- 引入 Service Mesh 级缓存(Envoy Local Cache),减少重复 RPC。
-
WebGL 端如何调微服务?
WebGL 不支持 TCP,只能 HTTPS + Fetch,需要把 gRPC 做 gRPC-Web 转码;同时CORS 预检会增加 1 RTT,国内可用 阿里云 API 网关直接托管,自动压缩、缓存、HTTPS 证书托管,省一条运维线。