高性能最终一致性框架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 3246 莫队+RMQ+单调栈
hnoi 2016 标签:题解 莫队 考虑左端点左移以及右端点右移产生的贡献 这样就可以由 \([l, r]\) 转移到另外的 \(4\) 个区间 \(f_{l, r}\) 表示右端点在 \(r\), ...
- Launch4j:An error occurred while starting the application.解决方案
长期使用Processing 2.X进行开发,突然有一天Processing 1.5.1打不开了,报错如下: 按[确定]后窗口消失,但是任务管理器中的“javaw.exe”并没有消失..... 试过各 ...
- 洛谷P1052过河
题目 不看数据范围的话是一个很简单的DP,可是加上数据范围之后就之前的做法就不行了. 所以我们考虑一下路径压缩. 小数据Code #include <iostream> #include ...
- segfault at 0 ip sp error 14
error 14从未见过.谁能帮我解答什么情况才会出现这个,而且怎么定位崩溃函数地址? 备忘: segfault at 引起故障的地址ip 指令的内存地址sp 堆栈指针地址, 及栈顶指针err is ...
- UOJ#221. 【NOI2016】循环之美 数论,杜教筛
原文链接www.cnblogs.com/zhouzhendong/p/UOJ221.html 题解 首先把题目转化为求 \[\sum_{x=1}^n \sum_{y=1}^m [\gcd(x,y) = ...
- css笔记 - flex弹性盒布局
flex: display:-webkit-box | -moz-box;盒布局 -webkit-box-flex | -moz-box-flex;弹性盒布局 -webkit-box-ordinal- ...
- 解决Spring Boot 拦截器注入service为空的问题
问题:在自定义拦截器中,使用了@Autowaire注解注入了封装JPA方法的Service,结果发现无法注入,注入的service为空 0.原因分析 拦截器加载的时间点在springcontext之前 ...
- Linux下的find命令详解
0x01 简介 find命令用来在指定目录下查找文件.任何位于参数之前的字符串都将被视为欲查找的目录名.如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件.并且将查找到的子 ...
- strace命令 二
让我们看一台高负载服务器的 top 结果: top 技巧:运行 top 时,按「1」打开 CPU 列表,按「shift+p」以 CPU 排序. 在本例中大家很容易发现 CPU 主要是被若干个 PHP ...
- https://software.intel.com/sites/landingpage/pintool/docs/97998/Pin/html/
https://software.intel.com/sites/landingpage/pintool/docs/97998/Pin/html/ http://www.brendangregg. ...