Akka分片集群的实现
2020-02-27 162浏览
- 1.Akka 分片集群的实现 InfoQ 北京 2014 @ 邓草原
- 2.Actor Model ● 一种计算颗粒(粒度),本身包含 : ● 处理(行为) ● 存贮(状态) ● 通讯(消息) ● 三定则—当 Actor 接收到一条消息时,它可以: 1.创建另外一些 Actors 2.向已知的 Actors 发送消息 3.指定接收下一条消息时的行为
- 3.Actor - 适合并行计算的最小颗粒 ● 单个 Actor 的状态和行为只由接收到的消息驱动 ● 单个 Actor 串行地处理接收到的消息 ➔ 单个 Actor 总是线程安全的 ● 大量 Actors 同时处在活跃状态,其行为是并行 的 ➔ 并行是多个 Actors 的行为
- 4.Entity 应该是 Actor ● 可以按需即时加载到内存 ● 可以设定 ReceiveTimeout 自动或主动从内存卸载 ● 应该持久化所有对状态产生影响的事件(消息) ● 可以持久化状态快照 ● 按固定间隔持久化快照(分钟线、日线) ● 从最近的快照恢复状态 ● Entity = 状态快照 + 事件重演 ● 不提倡 In-place Update 或者说修改持久化后的状态
- 5.Akka 的 Actor 实现 ● Actor 是非常轻量的计算单元 ● 5000 万 / 秒消息转发能力(单机、单核、本地) ● 250 万 Actors / GB 内存(每个空 Actor 约 400 多字节) ● Actor 位置透明,本身即具分布能力 ● 按地址创建和查找 - 本地或远程节点 ● 访问本地或远程节点仅在于地址 (Path) 不同 ● 可以跨节点迁移 ● Actor 是按层级实现督导 (supervision) 的 ● Actor 按树状组织成层级 ● 父 Actor 监控子 Actor 的状态,可以在出状况时停止、重启、恢复它。
- 6.Akka 2.3.X ● 分片集群 (Sharding Cluster) – Entity Actors ● 按 Entity 的 ID 分片,按需自动在相应的节点创建 ● 消息按 ID 发送,由 Resolver 根据 ID 自动定位到 Actor 所在的 region( 节点中 ) 并由 region 发送给 Actor ● 持久化 (Persistence) – 状态快照或事件历史 ● LevelDB (开发、测试) ● HBase
- 7.分片 - IdExtractor / ShardResolver type EntryId = String type ShardId = String type Msg = Any type IdExtractor = PartialFunction[Msg, (EntryId, Msg)] type ShardResolver = Msg => ShardId
- 8.分片 - IdExtractor / shardResolver sealed trait Command extends Msg with Serializable { defsessionId:String } // cluster 按 sessionId 与 actor 一一对应,按需即时创建或定位转发 lazy validExtractor:ShardRegion.IdExtractor = { casecmd:'>cmd: