一, Actor 介绍
Actor 是一种并发模型, 是共享内存并发模型的替代方案.
共享内存模型的缺点:
共享内存模型使用各种各样的锁来解决状态竞争问题, 性能低下且让编码变得复杂和容易出错.
共享内存受限于单节点的服务器资源限制.
Actor 模型的优点:
线程之间以消息进行通信, 消息按顺序单线程处理, 不存在状态竞争.
以消息方式通信, 可以方便的组建集群.
把 State 和 Behavior 绑定, 能更好的控制状态.
名词解释:
Mailbox: 可以理解为先入先出队列, 负责接收和缓存送达的消息.
State: 状态信息, 比如用户的账户余额信息.
Behavior: 负责按顺序处理 Mailbox 中的消息, 比如扣款消息, 到账消息, 查询余额消息等.
二, Orleans 介绍
Orleans 是. Net 基金会维护的一个 Actor 跨平台开源框架, 独创 Virtual Actor 概念, 支持分布式集群.
项目地址: http://dotnet.github.io/orleans/
有以下优点:
以对象方式访问 Actor, 符合面向对象的使用习惯.
提出 Virtual Actor 概念, 可以通过 ID 访问细粒度的 Actor, 能承载数千万的 Actor 对象.
支持 Stateful, 能替代缓存层来对内存状态进行更精确的控制, 减少数据库的压力.
高性能, 单个 Actor 能支持 10 万 + 的 QPS.
激活透明, Actor 对访问者是永久存在的, 但也提供完整的生命周期控制, 拓展方便.
原生支持集群, 但 Actor 位置透明, 访问者不需要关注 Actor 运行在那个节点, 集群会根据节点情况进行负载调度.
提供了多种集群支持, 集群部署非常方便, 支持 AdoNet,Zookeeper,K8s,SF 等.
提供了完整的单元测试解决方案, 方便进行单元测试.
提供了完善的监控工具, 能够详细的监测各种指标.
基于. net core, 支持各种平台.
名词解释:
Silo: 集群中的一个节点, 负责维护当前节点的 Grains.
SiloGateway: 每个节点都存在, 负责维护集群状态和转发请求.
Grain: 相当于 Actor, 通过 ID+Interface 来识别.
Client: 用来访问集群中的 Grain 的客户端工具.
三, Ray 介绍
Ray 是基于 Actor 模型构建的基于事件朔源的分布式最终一致性高性能框架, 把传统的复杂的分布式事务拆分为由事件驱动的线性处理流程的一种方式, 性能和吞吐更高, 响应更快.
Ray 提供了状态维护, 事件发布 / 订阅, 幂等性控制, 分布式事务等模块, 并内置了分布式 ID, 分布式锁, 分布式权重锁等服务.
Ray 提供卓越的性能, 单个 Actor 能达到 20000/s 的事件.
项目地址: https://github.com/RayTale/Ray
名词解释:
状态 (State): 内存聚合数据.
事件 (Event): 状态变化的信息.
EventBus: 提供事件发送和事件消费订阅.
幂等性: 保证事件送达多次不会导致状态异常, 例如上图的 A 的转账事件多次送达 B, 但是 B 只会增加一次余额.
Ray 的最终一致性转账原理
A 用户调用 A 账户 Actor 的转账方法进行转账, A 账户 Actor 根据内存状态进行余额校验, 如果余额不足, 则直接返回失败原因, 如果校验成功则产生一个转账 Event(记录目标账户 Id, 转账金额, 剩余余额) 并持久化, 然后修改内存状态和发送到 EventBus.EventBus 一个订阅者根据事件信息修改读库中 A 账户的余额和往账单表中插入一条转账账单, 另外一个订阅者根据事件信息调用 B 账户 Actor 的到账方法, B 账户 Actor 会产生一个到账 Event(记录到账金额, FromId, 剩余余额) 并持久化, 然后修改内存状态和发送到 EventBus,EventBus 的一个订阅者根据事件信息修改读库中 B 账户的余额和往账单表中插入一条到账账单.
来源: http://www.tuicool.com/articles/RrqAzin