
回复
作为在鸿蒙分布式系统中摸爬滚打的开发老鸟,Actor模型曾让我困惑——直到在订单系统中用它解决了分布式锁问题。本文结合实战经验,分享Actor模型的核心原理与落地技巧,帮你避开并发编程的坑。
维度 | 共享内存模型 | Actor模型(消息驱动) |
---|---|---|
数据安全 | 需手动加锁,易出现竞态 | 状态隔离,天然避免数据竞争 |
编程复杂度 | 锁机制增加心智负担 | 专注消息传递,逻辑更清晰 |
分布式扩展 | 跨节点共享内存成本高 | 消息队列天然支持分布式 |
实战案例:银行转账场景
actor Account {
private var balance: Int64 // 状态完全隔离
init(initial: Int64) {
balance = initial
}
// 接收消息的核心函数
receiver func transfer(amount: Int64, to: ActorRef<Account>) {
if balance >= amount {
balance -= amount
to.send(message: Deposit(amount: amount)) // 发送消息给目标账户
}
}
receiver func deposit(amount: Int64) {
balance += amount
}
}
// 调用方式
let from = spawn(Account(initial: 1000))
let to = spawn(Account(initial: 500))
from.send(message: Transfer(amount: 200, to: to))
关键特性:
receiver func
保证消息顺序处理,无需额外同步机制
actorId: "orderActor",
targetNode: "nodeB",
state: actorStateSnapshot
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 订单Actor │───→│ 支付Actor │───→│ 库存Actor │
│ (节点A) │ │ (节点B) │ │ (节点C) │
└─────────────┘ └─────────────┘ └─────────────┘
↑ ↑ ↑
└────────────────┼────────────────┘
┌──────────────────────┐
│ 分布式消息队列(基于DDS) │
└──────────────────────┘
优势: