Actor Model
1. 核心概念
Actor Model 是一种并发计算模型,用于设计高并发、分布式系统。其核心思想是: “万物皆Actor”,每个Actor是一个独立的计算单元,通过消息传递(Message Passing)进行通信,而非共享内存。
1.1 定义
Actor 的基本要素 组成部分 说明 状态(State) Actor内部维护的私有数据(其他Actor无法直接访问) 行为(Behavior) 定义Actor如何处理接收到的消息(类似一个消息处理函数) 邮箱(Mailbox) 存储接收到的消息队列(FIFO),确保消息有序处理 地址(Address) 每个Actor有唯一地址,用于接收消息 Actor Model是一种并发计算模型,基于三个基本原则:
- 每个Actor是完全独立的计算单元
- 只能通过异步消息进行通信
- 自动处理失败隔离
1.2 核心组件
type Actor struct {
mailbox chan Message // 消息邮箱(缓冲队列)
state interface{} // 私有状态
handler func(Message) // 消息处理函数
}
1.3 三大核心原则
- _封装性_:Actor的状态是私有的,其他Actor无法直接访问。Actor的状态只能通过消息修改,不能直接共享内存(避免锁竞争)
- 异步消息传递:Actor之间仅通过消息通信,发送后立即继续执行(非阻塞)
- 失败隔离:Actor可以独立处理失败,其他Actor不受影响。失败的Actor可以被重启或替换,而不会影响系统的整体运行。
2. 为什么需要Actor Model
2.1 传统并发的问题
问题 Actor模型的解决方案 共享内存竞争 无共享内存,仅消息传递 死锁/锁开销 无锁设计,天然避免死锁 扩展性差 分布式场景天然适配(如跨机器通信)
2.2适用场景
- 高并发系统(如聊天应用,游戏引擎)
- 分布式计算(如Akka集群,Erlang/OTP)
- 容错系统(如分布式数据库,微服务架构)
2.3 Actor生命周期
sequenceDiagram
participant Sender
participant Receiver
Sender->>Receiver: 异步发送消息
Receiver->>Receiver: 消息入队邮箱
Receiver->>Receiver: 顺序处理消息
2.4 Go伪代码
type Message struct {
Sender *Actor
Data interface{}
}
func (a *Actor) Run() {
for msg := range a.mailbox {
defer func() {
if r := recover(); r != nil {
a.handleFailure(r)
}
}()
a.behavior(msg) // 处理消息
}
}
// 父子监督机制
// 监督策略伪代码
type Supervisor struct {
children []*Actor
strategy func(*Actor, error) // 重启/停止策略
}
func (s *Supervisor) Monitor() {
for _, child := range s.children {
go func(a *Actor) {
if err := a.Run(); err != nil {
s.strategy(a, err)
}
}(child)
}
}
// 远程Actor通信
// 跨网络通信伪代码
type RemoteActor struct {
Address string
}
func (r *RemoteActor) Send(msg Message) {
conn, _ := net.Dial("tcp", r.Address)
gob.NewEncoder(conn).Encode(msg) // 序列化消息
}
## 3 Actor vs 传统线程模型
| 特性 | Actor Model | 传统线程模型 |
|--------------|---------------------------------|-------------------------------|
| 并发单位 | Actor(轻量级,百万级) | 线程(重量级,千级) |
| 通信方式 | 消息传递(异步) | 共享内存(需锁同步) |
| 容错性 | 崩溃不影响其他Actor(隔离性) | 线程崩溃可能导致整个进程挂掉 |
| 扩展性 | 天然支持分布式 | 需额外框架(如gRPC) |
| 设计复杂度 | 简单(Actor独立) | 复杂(锁、条件变量等) |