高性能最终一致性框架Ray之基本概念原理
一、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账户的余额和往账单表中插入一条到账账单。
高性能最终一致性框架Ray之基本概念原理的更多相关文章
- 高性能最终一致性框架Ray之基本功能篇
一.Event(事件) Event是Actor产生的记录状态变化的日志,由StateId(状态Id),UID(幂等性控制),TypeCode(事件类型),Data(事件数据),Version(事件版本 ...
- 高性能分布式执行框架——Ray
Ray是UC Berkeley AMP实验室新推出的高性能分布式执行框架,它使用了和传统分布式计算系统不一样的架构和对分布式计算的抽象方式,具有比Spark更优异的计算性能. Ray目前还处于实验室阶 ...
- 框架Ray
高性能最终一致性框架Ray之基本概念原理 一.Actor介绍 Actor是一种并发模型,是共享内存并发模型的替代方案. 共享内存模型的缺点: 共享内存模型使用各种各样的锁来解决状态竞争问题,性能低下且 ...
- 高性能环形队列框架 Disruptor 核心概念
高性能环形队列框架 Disruptor Disruptor 是英国外汇交易公司LMAX开发的一款高吞吐低延迟内存队列框架,其充分考虑了底层CPU等运行模式来进行数据结构设计 (mechanical s ...
- 分布式事务最终一致性-CAP框架轻松搞定
前言 对于分布式事务,常用的解决方案根据一致性的程度可以进行如下划分: 强一致性(2PC.3PC):数据库层面的实现,通过锁定资源,牺牲可用性,保证数据的强一致性,效率相对比较低. 弱一致性(TCC) ...
- NoSQL的三大基石(CAP、BASE和最终一致性)
CAP,BASE和最终一致性是NoSQL数据库存在的三大基石.而五分钟法则是内存数据存储了理论依据.这个是一切的源头. CAP C: Consistency 一致性 A: Availability 可 ...
- .NET Core微服务之基于MassTransit实现数据最终一致性(Part 1)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.预备知识:数据一致性 关于数据一致性的文章,园子里已经有很多了,如果你还不了解,那么可以通过以下的几篇文章去快速地了解了解,有个感性认 ...
- 如何选择分布式事务形态(TCC,SAGA,2PC,补偿,基于消息最终一致性等等)
各种形态的分布式事务 分布式事务有多种主流形态,包括: 基于消息实现的分布式事务 基于补偿实现的分布式事务(gts/fescar自动补偿的形式) 基于TCC实现的分布式事务 基于SAGA实现的分布式事 ...
- 如何选择分布式事务形态(TCC,SAGA,2PC,基于消息最终一致性等等)
各种形态的分布式事务 分布式事务有多种主流形态,包括: 基于消息实现的分布式事务 基于补偿实现的分布式事务 基于TCC实现的分布式事务 基于SAGA实现的分布式事务 基于2PC实现的分布式事务 这些形 ...
随机推荐
- 聊一聊 SpringBoot 自动配置的原理
解析思路 我们建立好一个SpringBoot的工程后,我们将从启动类,SpringBootApplication开始进行探究. 开始解析 首先我们建立一个 Springboot的工程.找到启动类,我们 ...
- 在linux系统下安装mysql详解,以及远程调用连接不上mysql的解决方法。
步骤: 1)查看CentOS自带的mysql 输入 rpm -qa | grep mysql 2)将自带的mysql卸载 3)上传Mysql的安装包到linux 4)安装mysql的依赖(不是必须) ...
- SpringDataJpa在一对多、多对多关系映射时出现StackOverflowError
在使用spring-data-jpa时,进行一对多配置后,在调用save方法时,出现内存溢出. 产生原因一:为了方便看信息,在两类中分别重写了 toString 方法,导致查询加载时两类在互相调用对方 ...
- 腾讯PCG(后台开发) 牛客网视频面试 一面
腾讯视频面试 作为一个小渣渣记录一下,腾讯是我一直想进的公司,但其实准备的时间不是很长,也不是科班还是存在很大的劣势,记录一下找工作的经历. 首先说一下,这是我第一次视频面试,还是蛮紧张的.不过面试官 ...
- hive动态分区与静态分区
测试目的:1.分区表的动态分区与静态分区2.每层数据,数据流向,数据是否在每层都保留一份测试结果:1.动态分区/静态分区略2.每层表的数据都会保留,因此在生产上odm层的数据是可以删除的(不管是内表还 ...
- Spring入门(十):Spring AOP使用讲解
1. 什么是AOP? AOP是Aspect Oriented Programming的缩写,意思是:面向切面编程,它是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 可以认为AOP是 ...
- python paramiko外部传参和内部调用命令的方法
学习了很久的python,但在工作中使用的时候,却发现不知道怎么传参进入到python中执行,所以这两天就研究 了python args怎么将外部参数传入到python中执行 1.首先使用python ...
- 微服务SpringCloud之Spring Cloud Config配置中心服务化
在前面两篇Spring Cloud Config配置中心的博客中都是需要指定配置服务的地址url:spring.cloud.config.uri,客户端都是直接调用配置中心的server端来获取配置文 ...
- 企查查app 初步探索
企查查app sign算法破解初步探索 之前有说过企查查的sign的解密,但这次是企查查app的sign算法破解,目前是初步进程. 已删除!!!! 上边一些变量已经找到了,其中就有时间戳,其余两个需要 ...
- vue实现输入框的模糊查询(节流函数的应用场景)
上一篇讲到了javascript的节流函数和防抖函数,那么我们在实际场合中该如何运用呢? 首先,我们来理解一下:节流函数首先是节流,就是节约流量.内存的损耗,旨在提升性能,在高频率频发的事件中才会用到 ...