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

Q73: Actor 模型是什么?有什么优势?

核心结论

Actor 模型的核心价值,不在于“消息队列”这个形式,而在于把共享状态改成“单拥有者加消息驱动”。

它最适合解决的问题通常是:

  • 共享状态过多
  • 锁竞争明显
  • 对象天然可以按实体、房间或场景分治

但 Actor 也不是通用银弹,跨 Actor 协作、邮箱积压和调试复杂度都是真实代价。

一、Actor 模型到底在做什么

可以把一个 Actor 理解成:

  • 一份被它独占的状态
  • 一个输入邮箱
  • 一段串行处理这些消息的逻辑

它的关键不是“异步”,而是“同一份状态尽量只由一个执行上下文修改”。

二、它为什么能减少锁问题

因为它尽量避免多个线程同时改同一对象。

如果玩家、房间、场景这类对象都各自有明确归属,那么很多原本需要锁的共享写入,就会变成消息投递。

这也是 Actor 最大的工程价值。

三、在游戏服务里哪里最自然

最常见的落点包括:

  • 玩家实体
  • 房间
  • 副本实例
  • 场景分区

这些对象本来就很适合:

  • 串行推进状态
  • 通过消息接收外部请求

四、Actor 的优势主要体现在哪

1. 状态归属清晰

谁能改什么状态更容易说清楚。

2. 锁竞争更少

很多共享写入变成消息化后,热点锁会明显减少。

3. 更适合分布式扩展

如果 Actor 身份和位置可路由,它天然有机会扩展到多节点。

五、Actor 也有明显代价

1. 邮箱积压

如果单 Actor 成为热点,它会变成串行瓶颈。

2. 跨 Actor 协调复杂

一旦一个业务需要同时改多个 Actor 状态,事务和一致性会明显复杂。

3. 调试难度更高

异步消息链通常比直接调用更难追踪。

六、不要把任何消息队列系统都叫 Actor

真正值得称为 Actor 风格的前提通常是:

  • 状态有明确拥有者
  • 处理是串行的
  • 外部通过消息而不是共享内存改状态

如果只是“线程池加队列”,那不等于 Actor 模型。

七、工程上更稳妥的理解

Actor 更像是一种并发组织方法,而不是一套必须全局贯彻的信仰。

很多在线游戏会在局部采用 Actor 思想,例如:

  • 场景内实体串行处理
  • 房间消息由单线程推进

但外围系统仍可能是:

  • 普通 RPC
  • 多进程服务
  • 线程池后台任务

八、常见误区

1. 用了 Actor 就没有并发问题

不对。跨 Actor 协调和热点 Actor 一样会成为问题。

2. Actor 一定比锁快

不一定。要看消息成本、粒度和实际负载模型。

3. 所有模块都适合 Actor 化

很多后台管理、低频服务并不值得强行 Actor 化。

参考资料

  • Actor 模型、邮箱调度与游戏实体并发组织实践资料
在 GitHub 上编辑此页
最后更新: 3/20/26, 6:06 AM
贡献者: cuihairu