高性能最终一致性框架Ray之基本功能篇
一、Event(事件)
Event是Actor产生的记录状态变化的日志,由StateId(状态Id),UID(幂等性控制),TypeCode(事件类型),Data(事件数据),Version(事件版本),Timestamp(时间戳)组成。
持久化:Ray提供Mongodb、Postgresql、Sqlserver、Mysql的拓展支持,可以单独使用其中一个,也可以混合使用。
EventBus:当Event持久化之后进行分发以驱动后续业务流程、同步到读库以及自定义消费者,目前支持RabbitMQ和Kafka的拓展。
订阅:基于Ray提供的ObserverGrain、ShadowGrain的订阅者不依赖于EventBus的可靠性和有序性,框架会对Event的顺序进行校验,对丢失的Event进行恢复,自定义订阅者只能用来执行对Event可靠性要求不高的任务。
ObserverGrain:订阅Event执行后续流程和同步到读库。
ShadowGrain:订阅Event执行后续流程,但流程需要用到实时状态。
二、State(状态)
State是一个聚合对象(等价DDD概念中的聚合根),业务的最新数据,驻留于Actor中,框架会定期保持快照。
生命周期:State的生命周期等同于Actor的生命周期,可以通过配置进行控制。
持久化:State的持久化不是实时的,通过VersionInterval(间隔版本)、MinVersionInterval(最小间隔版本,失活时持久化条件)来对每种Actor进行控制。持久化过程可以通过重写OnStartSaveSnapshot方法来进行自定义处理(例如无法序列化数据的自定义存储)。
恢复:使用Snapshot(快照)+后续的Event进行恢复,恢复过程可以通过重写ReadSnapshotAsync方法来进行自定义控制(例如无法序列化数据的自定义恢复)。
访问:State保存于Actor中,Actor内部可以直接访问,外部需要通过API进行访问。
集群:集群依赖于Orleans的集群管理,State分布于集群中的某一个节点,只会存在一份,系统会根据节点负载情况进行自动调度。
三、Grain(Actor)
Grain是State的载体,提供外部访问State的API和控制Event产生。Grain也可以在内部访问访问其它Grain.
RayGrain:最基本的Grain,每次只能提交一个Event,支持开启并发读,但不支持开启并发写。
TxGrain:提供基本事务功能的Grain,可以在方法内部同时提交多个Event,支持开启并发读,但不支持开启并发写。
ConcurrentTxGrain:继承自TxGrain,但提供额外的方法以支持并发写,提高单个Grain的吞吐。
DTxGrain:继承自ConcurrentTxGrain,但提供分布式事务支持,可以以事务方式对多个Grain提交事件。
ObserverGrain:事件订阅Grain,订阅上面几个Grain的Event执行后续流程和同步到读库。
ShadowGrain:事件订阅Grain,订阅上面几个Grain的Event执行需要依赖事件生产者实时状态的业务流程。
DTxObserverGrain:功能同ObserverGrain,生产者为DTxGrain的时候需要使用该Grain.
DTxShadowGrain:功能同ShadowGrain,生产者为ShadowGrain的时候需要使用该Grain.
四、归档
由于EventSourcing会产生大量的事件日志,会占用大量的存储空间,但手动清理会导致状态异常和幂等性丢失,所以由框架对事件进行归档以减少事件库的事件量同时保证可靠性。
归档条件:归档的条件可以通过ArchiveOptions对每种Actor进行配置。
归档方式:归档方式有清理和转移两种方式。
清理:直接删除需要归档的事件。
转移:把需要归档的事件从时间表转移到归档表,由管理员后续处理。
高性能最终一致性框架Ray之基本功能篇的更多相关文章
- 高性能最终一致性框架Ray之基本概念原理
一.Actor介绍 Actor是一种并发模型,是共享内存并发模型的替代方案. 共享内存模型的缺点: 共享内存模型使用各种各样的锁来解决状态竞争问题,性能低下且让编码变得复杂和容易出错. 共享内存受限于 ...
- 高性能分布式执行框架——Ray
Ray是UC Berkeley AMP实验室新推出的高性能分布式执行框架,它使用了和传统分布式计算系统不一样的架构和对分布式计算的抽象方式,具有比Spark更优异的计算性能. Ray目前还处于实验室阶 ...
- 框架Ray
高性能最终一致性框架Ray之基本概念原理 一.Actor介绍 Actor是一种并发模型,是共享内存并发模型的替代方案. 共享内存模型的缺点: 共享内存模型使用各种各样的锁来解决状态竞争问题,性能低下且 ...
- 如何选择分布式事务形态(TCC,SAGA,2PC,补偿,基于消息最终一致性等等)
各种形态的分布式事务 分布式事务有多种主流形态,包括: 基于消息实现的分布式事务 基于补偿实现的分布式事务(gts/fescar自动补偿的形式) 基于TCC实现的分布式事务 基于SAGA实现的分布式事 ...
- 如何选择分布式事务形态(TCC,SAGA,2PC,基于消息最终一致性等等)
各种形态的分布式事务 分布式事务有多种主流形态,包括: 基于消息实现的分布式事务 基于补偿实现的分布式事务 基于TCC实现的分布式事务 基于SAGA实现的分布式事务 基于2PC实现的分布式事务 这些形 ...
- 使用 Masstransit中的 Request/Response 与 Courier 功能实现最终一致性
简介 目前的.net 生态中,最终一致性组件的选择一直是一个问题.本地事务表(cap)需要在每个服务的数据库中插入消息表,而且做不了此类事务 比如:创建订单需要 余额满足+库存满足,库存和余额处于两个 ...
- 分布式事务最终一致性-CAP框架轻松搞定
前言 对于分布式事务,常用的解决方案根据一致性的程度可以进行如下划分: 强一致性(2PC.3PC):数据库层面的实现,通过锁定资源,牺牲可用性,保证数据的强一致性,效率相对比较低. 弱一致性(TCC) ...
- .NET Core微服务之基于MassTransit实现数据最终一致性(Part 1)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.预备知识:数据一致性 关于数据一致性的文章,园子里已经有很多了,如果你还不了解,那么可以通过以下的几篇文章去快速地了解了解,有个感性认 ...
- 脑裂 CAP PAXOS 单元化 网络分区 最终一致性 BASE
阿里技术专家甘盘:浅谈双十一背后的支付宝LDC架构和其CAP分析 https://mp.weixin.qq.com/s/Cnzz5riMc9RH19zdjToyDg 汤波(甘盘) 技术琐话 2020- ...
随机推荐
- Luogu P3810 【模板】三维偏序(陌上花开) CDQ分治 树状数组
https://www.luogu.org/problemnew/show/P3810 复习板子,重要的题就真的要写三遍???之前写过一篇博客了,不过之前写的那个板子的sort用的规则真是沙雕 #in ...
- (16)打鸡儿教你Vue.js
博客: Hexo搭建个性博客 https://hexo.io/zh-cn/ 快速.简洁且高效的博客框架 超快速度 Node.js 所带来的超快生成速度,让上百个页面在几秒内瞬间完成渲染. 支持 Mar ...
- sed、awk工具
ed sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出.s ...
- golang 无缓冲channel
golang 无缓冲channel package main import "fmt" func main() { // 1S =1000ms //1ms = 1000us //1 ...
- Go程序员面试算法宝典-读后感2-链表
链表作为最基本的数据结构,它不仅仅在实际应用中有着非常重要的作用,而且也是程序员面试笔试必考的内容. 详情请Google吧. 1.如何实现链表的逆序 就地逆序 package main import ...
- GO语言数组,切片,MAP总结
数组 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 数组的长度必须是常量,并且长度是数组类型的一部分.一旦定义,长度不能变.数 ...
- Python多线程与多进程详解
进程,线程,协程https://blog.csdn.net/qq_23926575/article/details/76375337 多进程 https://www.cnblogs.com/lipij ...
- useReducer介绍和简单使用(六)
上节课学习了useContext函数,那这节课开始学习一下useReducer,因为他们两个很像,并且合作可以完成类似的Redux库的操作.在开发中使用useReducer可以让代码具有更好的可读性和 ...
- Spring源码解析--IOC根容器Beanfactory详解
BeanFactory和FactoryBean的联系和区别 BeanFactory是整个Spring容器的根容器,里面描述了在所有的子类或子接口当中对容器的处理原则和职责,包括生命周期的一些约定. F ...
- DialogFragment: DialogFragment的一些理解
Android 自3.0版本引入了DialogFragment这个类,并推荐开发者使用这个类替代之前经常使用的Dialog类,那么DialogFragment相对于之前的Dialog究竟有什么优势呢? ...