Apollo 技术文档Apollo 技术文档
指南
  • 架构概述
  • BigWorld 架构深度解析
  • BigWorld 进程架构与玩家生命周期
  • AOI九宫格系统详解
  • AOI广播与消息去重
  • Base 模块
  • Core 模块
  • Runtime 模块
  • Data 模块
  • Network 模块
  • /modules/actor.html
  • Game 模块
  • BigWorld 模块
服务器应用
API 参考
QA
GitHub
指南
  • 架构概述
  • BigWorld 架构深度解析
  • BigWorld 进程架构与玩家生命周期
  • AOI九宫格系统详解
  • AOI广播与消息去重
  • Base 模块
  • Core 模块
  • Runtime 模块
  • Data 模块
  • Network 模块
  • /modules/actor.html
  • Game 模块
  • BigWorld 模块
服务器应用
API 参考
QA
GitHub
  • MMORPG 架构 QA

Q6: 单服架构 vs 分布式架构,如何选择?

核心结论

这不是一个“谁更先进”的问题,而是一个“当前阶段最合适什么复杂度”的问题。

  • 单服架构适合早期验证、玩法较轻、团队较小、运维能力有限的项目
  • 分布式架构适合大世界、高并发、长周期运营、需要弹性扩容和故障隔离的项目
  • 真正成熟的方案通常不是一开始就全面分布式,而是按瓶颈逐步演进

一、先把概念说清楚

实际讨论里,“单服”和“分布式”经常被混用。更准确的划分应该是三层:

1. 单进程单机

所有网络、业务、状态、定时器、数据库访问都在一个进程里。

特点:

  • 开发和调试最简单
  • 内存共享,函数调用成本低
  • 没有跨进程序列化和网络转发
  • 容量、隔离性、容错性都受限于单进程

2. 单机多进程

仍然部署在一台机器上,但开始按职责拆进程,例如网关进程、逻辑进程、数据库代理进程。

特点:

  • 复杂度明显低于多机分布式
  • 可以先建立进程边界和协议边界
  • 方便后续平滑迁移到多机部署
  • 仍然受限于单机 CPU、内存、网络和故障域

3. 多机分布式

不同职责或不同分片部署到多台机器上,通过 RPC、消息总线或专用协议通信。

特点:

  • 可以横向扩容
  • 可以做资源隔离和故障隔离
  • 部署、调试、监控、一致性问题都更复杂
  • 对团队工程能力和运维能力要求更高

因此,很多项目的真实路径不是“单服 or 分布式”二选一,而是:

单进程单机 -> 单机多进程 -> 多机分布式


二、两类架构的本质差异

维度单服架构分布式架构
计算边界一个进程或一台机器内多进程、多机
通信方式函数调用 / 共享内存RPC / 消息 / 网络协议
状态管理本地状态集中管理状态需要分片、复制或迁移
故障影响面进程或整机级别组件级别,可隔离
扩容方式升级单机配置为主横向扩容为主
调试难度低高
运维成本低高
数据一致性相对简单明显更难
延迟开销低更高,需要控制链路长度

本质上,单服用“简单性”换开发效率,分布式用“复杂性”换容量、弹性和隔离性。


三、不要只看在线人数

在线人数很重要,但不是唯一指标。架构选择至少要看五个维度。

3.1 玩法是否天然要求空间拆分

如果游戏是以下类型,分布式价值很高:

  • 大世界 MMORPG
  • 大地图生存
  • 多区域并行模拟
  • 高密度实时交互场景

因为核心瓶颈不是登录连接数,而是:

  • 空间模拟负载
  • AOI 广播负载
  • 战斗结算负载
  • 实体迁移和跨区路由

如果是以下类型,单服往往更合适:

  • 卡牌
  • 回合制
  • 房间制小游戏
  • 低实时性社交玩法

这类项目的核心压力往往在数据库、网关连接、活动峰值,而不是连续空间模拟。

3.2 热点是否可被切开

分布式并不自动解决热点。

如果一个场景里 2000 人必须共享同一个战场状态、同一套技能事件流、同一套 AOI 结果,那么再多机器也未必能把这个热点轻松拆掉。因为热点本身可能是强耦合的。

这类问题需要先回答:

  • 能否按地图分区
  • 能否按房间拆分
  • 能否按频道拆分
  • 能否按逻辑域拆分
  • 能否接受局部降级

如果热点天然不可分,分布式只能缓解外围压力,不能消灭核心热点。

3.3 团队是否驾驭得住复杂度

分布式会引入一整套新增问题:

  • 服务发现
  • 路由与寻址
  • 超时、重试、幂等
  • 状态迁移
  • 节点摘除和恢复
  • 灰度发布
  • 全链路监控
  • 分布式一致性

如果团队当前连单机性能分析、线上诊断、压测建模都不稳定,过早分布式通常只是把问题扩散到更多节点。

3.4 是否需要长期运营能力

只做版本验证、成本敏感、生命周期短的项目,单服通常更划算。

但如果目标是:

  • 长周期商业化运营
  • 活动期波峰明显
  • 需要跨服活动
  • 需要不停服迁移或弹性扩容
  • 强依赖容灾和快速恢复

那分布式的投入通常是值得的。

3.5 是否已经出现了明确瓶颈

正确的迁移方式不是“预判未来会火,所以先上全套分布式”,而是基于实际瓶颈推进。

常见信号包括:

  • 单进程 CPU 已长期接近上限
  • 特定地图或战斗线程成为稳定热点
  • 登录、聊天、排行榜等外围系统拖累主逻辑
  • 发布、重启、故障恢复成本过高
  • 单机升级已经不能有效解决问题

四、MMO 场景下如何判断

4.1 什么情况下单服就够

以下情况通常可以先做单服或单机多进程:

  • 项目还在验证玩法
  • 世界规模不大
  • 单场景人数上限不高
  • 交互强度不高
  • 先把战斗、任务、成长链路跑通更重要

典型目标是:

  • 尽快上线
  • 尽快压测
  • 尽快看真实玩家行为

这时最有价值的不是“架构看起来很大”,而是“系统可快速迭代、问题可快速定位”。

4.2 什么情况下必须认真考虑分布式

以下情况通常说明已经接近分布式门槛:

  • 存在持续运行的大地图或连续空间
  • 单地图要承载大量实时实体
  • AOI、广播、战斗结算成为主要瓶颈
  • 不同地图、频道、战场需要独立扩容
  • 玩家跨区迁移是常态能力而不是偶发需求
  • 线上容灾、热迁移、弹性扩容是刚需

这类项目里,空间逻辑和账户逻辑分层通常很重要。像 KBEngine 的 BaseApp / CellApp 划分,本质上就是把“玩家持久状态”和“空间实时状态”拆开,以便分别扩展和迁移。


五、分布式并不等于“无限扩展”

很多文档喜欢写“理论上只要不断加机器就能无限扩展”,这只能作为方向性的表述,不能当成工程结论。

实际限制通常来自:

  • 单场景热点无法拆分
  • 跨节点同步开销上升
  • 广播扇出增长过快
  • 数据一致性和回滚成本变高
  • 调度器和管理节点出现瓶颈
  • 数据库、缓存、消息队列成为新的中心瓶颈

更准确的说法应该是:

分布式可以显著提高系统上限,但能否扩得动,取决于负载是否可拆、状态是否可迁、链路是否足够短、热点是否可控。


六、一个更实用的选择方法

6.1 先做架构分层,再决定是否分布式

即使当前只部署单机,也建议先把边界拆清楚:

  • 接入层:连接、鉴权、限流
  • 会话层:玩家在线态、会话路由
  • 空间层:地图、AOI、战斗、移动
  • 数据层:持久化、缓存、索引
  • 后台层:邮件、排行榜、GM、活动

这样做的好处是:

  • 单机阶段仍然简单
  • 模块依赖更清晰
  • 后续可以按边界拆进程,而不是重写一遍

6.2 推荐的演进路线

阶段 1:单进程单机

适合:

  • 原型验证
  • 小团队第一版
  • 核心玩法未稳定

目标:

  • 尽快形成可玩版本
  • 建立压测和监控基础

阶段 2:单机多进程

先拆出高价值边界:

  • 网关
  • 场景逻辑
  • 数据访问
  • 后台异步任务

这个阶段最关键,因为它决定后面是否能平滑进入真正分布式。

阶段 3:多机分布式

在以下前提成立后再推进:

  • 负载热点已明确
  • 协议边界已稳定
  • 监控、日志、追踪已具备
  • 运维流程已成型

这时再把网关、会话、空间、后台系统按机器拆开,投入产出比更高。


七、一个务实的对比表

场景更适合的选择原因
小团队首个 MMO 原型单服或单机多进程优先验证玩法和流程
房间制游戏单服状态天然按房间隔离,单机足够
中小规模回合制单服实时性和空间连续性要求不高
大世界 MMORPG分布式空间模拟、AOI、迁移都需要拆分
大量跨服活动分布式需要独立扩缩容和隔离
运营期成熟项目分布式发布、容灾、弹性要求更高

需要特别注意:

  • MMORPG = 分布式 不是绝对结论,小规模 MMO 也可以先单服起步
  • FPS/MOBA = 分布式 也不是绝对结论,很多房间制对局服务本质上是大量独立单房间实例
  • 真正该看的不是题材名,而是状态耦合度、实时性、容量目标和运营要求

八、实践建议

8.1 小团队的优先级

如果团队规模有限,建议优先保证四件事:

  • 架构边界清楚
  • 压测模型真实
  • 监控和日志可用
  • 热点能被定位

这些能力比“先上分布式”更重要。

8.2 什么时候不要急着分布式

以下情况通常不适合马上上分布式:

  • 核心玩法还没定
  • 连单机瓶颈都没测出来
  • 没有线上监控和追踪
  • 没有稳定的自动化部署
  • 团队对故障定位经验不足

因为这时复杂度增加的速度,往往会快于收益增长的速度。

8.3 什么时候值得投入分布式

以下情况通常说明投入分布式已经划算:

  • 单机性能上限被持续命中
  • 热点可以被相对干净地拆分
  • 业务进入长期运营阶段
  • 架构团队和运维流程已经具备
  • 单点故障和扩容效率开始影响业务目标

九、总结

一个更稳妥的判断方式是:

  1. 先用单机把玩法和工程基础打稳
  2. 再用多进程建立模块边界
  3. 最后针对真实瓶颈做分布式拆分

因此,单服和分布式不是对立关系,而是同一个项目在不同阶段的不同形态。

如果项目核心是“快速验证”,优先单服。 如果项目核心是“持续运营的大世界高并发模拟”,优先分布式。 如果现在还不确定,通常说明最合理的选择是先做可演进的单机架构,而不是一步到位把系统做重。


参考资料

  • KBEngine GitHub
  • KBEngine Lab - 引擎概览
  • Scalable Game Server Architecture - GDC
在 GitHub 上编辑此页
最后更新: 3/20/26, 6:06 AM
贡献者: cuihairu