一、Actor介绍

Actor是一种并发模型,是共享内存并发模型的替代方案。

共享内存模型的缺点:
  1. 共享内存模型使用各种各样的锁来解决状态竞争问题,性能低下且让编码变得复杂和容易出错。

  2. 共享内存受限于单节点的服务器资源限制。

Actor模型的优点:
  1. 线程之间以消息进行通信,消息按顺序单线程处理,不存在状态竞争。

  2. 以消息方式通信,可以方便的组建集群。

  3. 把State和Behavior绑定,能更好的控制状态。

名词解释:

Mailbox:可以理解为先入先出队列,负责接收和缓存送达的消息。

State:状态信息,比如用户的账户余额信息。

Behavior:负责按顺序处理Mailbox中的消息,比如扣款消息、到账消息,查询余额消息等。

二、Orleans介绍

Orleans是.Net基金会维护的一个Actor跨平台开源框架,独创Virtual Actor概念,支持分布式集群。

项目地址:http://dotnet.github.io/orleans/

有以下优点:
  1. 以对象方式访问Actor,符合面向对象的使用习惯。

  2. 提出Virtual Actor概念,可以通过ID访问细粒度的Actor,能承载数千万的Actor对象。

  3. 支持Stateful,能替代缓存层来对内存状态进行更精确的控制,减少数据库的压力。

  4. 高性能,单个Actor能支持10万+的QPS。

  5. 激活透明,Actor对访问者是永久存在的,但也提供完整的生命周期控制,拓展方便。

  6. 原生支持集群,但Actor位置透明,访问者不需要关注Actor运行在那个节点,集群会根据节点情况进行负载调度。

  7. 提供了多种集群支持,集群部署非常方便,支持AdoNet,Zookeeper,K8s,SF等。

  8. 提供了完整的单元测试解决方案,方便进行单元测试。

  9. 提供了完善的监控工具,能够详细的监测各种指标。

  10. 基于.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

名词解释:

  1. 状态(State):内存聚合数据。

  2. 事件(Event):状态变化的信息。

  3. EventBus:提供事件发送和事件消费订阅。

  4. 幂等性:保证事件送达多次不会导致状态异常,例如上图的A的转账事件多次送达B,但是B只会增加一次余额。

Ray的最终一致性转账原理

A用户调用A账户Actor的转账方法进行转账,A账户Actor根据内存状态进行余额校验,如果余额不足,则直接返回失败原因,如果校验成功则产生一个转账Event(记录目标账户Id、转账金额、剩余余额)并持久化,然后修改内存状态和发送到EventBus。EventBus一个订阅者根据事件信息修改读库中A账户的余额和往账单表中插入一条转账账单,另外一个订阅者根据事件信息调用B账户Actor的到账方法,B账户Actor会产生一个到账Event(记录到账金额、FromId、剩余余额)并持久化,然后修改内存状态和发送到EventBus,EventBus的一个订阅者根据事件信息修改读库中B账户的余额和往账单表中插入一条到账账单。

框架Ray的更多相关文章

  1. 学界| UC Berkeley提出新型分布式框架Ray:实时动态学习的开端—— AI 应用的系统需求:支持(a)异质、并行计算,(b)动态任务图,(c)高吞吐量和低延迟的调度,以及(d)透明的容错性。

    学界| UC Berkeley提出新型分布式框架Ray:实时动态学习的开端 from:https://baijia.baidu.com/s?id=1587367874517247282&wfr ...

  2. 解析分布式应用框架Ray架构源码

    摘要:Ray的定位是分布式应用框架,主要目标是使能分布式应用的开发和运行. Ray是UC Berkeley大学 RISE lab(前AMP lab) 2017年12月 开源的新一代分布式应用框架(刚发 ...

  3. 高性能分布式执行框架——Ray

    Ray是UC Berkeley AMP实验室新推出的高性能分布式执行框架,它使用了和传统分布式计算系统不一样的架构和对分布式计算的抽象方式,具有比Spark更优异的计算性能. Ray目前还处于实验室阶 ...

  4. 高性能最终一致性框架Ray之基本概念原理

    一.Actor介绍 Actor是一种并发模型,是共享内存并发模型的替代方案. 共享内存模型的缺点: 共享内存模型使用各种各样的锁来解决状态竞争问题,性能低下且让编码变得复杂和容易出错. 共享内存受限于 ...

  5. 高性能最终一致性框架Ray之基本功能篇

    一.Event(事件) Event是Actor产生的记录状态变化的日志,由StateId(状态Id),UID(幂等性控制),TypeCode(事件类型),Data(事件数据),Version(事件版本 ...

  6. 取代 Python 多进程!伯克利开源分布式框架 Ray

    Ray 由伯克利开源,是一个用于并行计算和分布式 Python 开发的开源项目.本文将介绍如何使用 Ray 轻松构建可从笔记本电脑扩展到大型集群的应用程序. 并行和分布式计算是现代应用程序的主要内容. ...

  7. 使用DataFlow表达ControlFlow的一些思考

    一.控制流 从接触面向过程语言开始,使用控制流编程的概念已是司空见惯. if (condition) { // do something } else { // do something else } ...

  8. 伯克利推出世界最快的KVS数据库Anna:秒杀Redis和Cassandra

    天下武功,唯快不破. 伯克利 RISE 实验室推出了最新的键值存储数据库 Anna,提供了惊人的存取速度.超强的伸缩性和史无前例的一致性保证.Jeff Dean 说,当一个系统增长到十倍规模时,就需要 ...

  9. 安娜Anna:世界最快的超级伸缩的KVS, 秒杀Redis

    伯克利 这个大学在计算机学术界.工业界的地位举足轻重,其中的AMP实验室曾开发出了一大批大获成功. 对计算机行业产生深远影响的分布式计算技术,包括 Spark.Mesos.Tachyon 等.作为AM ...

随机推荐

  1. 一款神器,批量手机号码归属地查询软件,支持导出Excel表格

    很多人查询手机号码归属地,还在一个一个百度去查太慢了,如果有几万个那么是不是要百度很久 有一款软件很多人都不知道,可以吧号码复制进去,即使里面有汉字也可以把手机号码挑出来,然后查询归属地,还具有号码去 ...

  2. Winform c# 多线程处理实例

    我们在用C# 开发程序时,经常会使用的多线程,实现多任务的处理.一般常用的方法是新建多个线程,进行处理. 今天我分享一个采用线程池的方式来实现的实例.对有需要的朋友做个借鉴. 实例: Winform ...

  3. 24个Jvm面试题总结及答案

    1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件. Java被 ...

  4. python动态视频下载器

    这里向大家分享一下python爬虫的一些应用,主要是用爬虫配合简单的GUI界面实现视频,音乐和小说的下载器.今天就先介绍如何实现一个动态视频下载器. 爬取电影天堂视频 首先介绍的是python爬取电影 ...

  5. CSS 总结 [目录]

    一.CSS 基础 1.CSS 初识 2.CSS 用法和特性 二.CSS 选择器 1.基本选择器 2.组合选择器 3.属性选择器 4.伪类选择器 5.伪元素选择器 三.CSS 字体样式 四.CSS 文本 ...

  6. QT在Mac OS上编译运行初体验

    QT是一个跨平台的框架,支持PC端(Windows.Linux和Mac OS)以及移动端(Android和IOS),之前的开发大都在Windows或者Ubuntu上,考虑到项目多平台支持性,本文对Ma ...

  7. 英语cabardine麝香cabardine单词

    麝香(cabardine)是麝科动物林麝Moschus berezovskii Flerov. 马麝M. sifanicusPrzewalski或原麝M.moschiferus L.雄体香囊中的干燥分 ...

  8. linq to js 用法

    /** * 排序汇总 * */ var result = Enumerable.From(vm.productList).GroupBy("$.goods_id", null, f ...

  9. android studio学习----添加项目依赖包总结

    Gradle Library Projects Gradle 项目可以依赖于其它组件.这些组件可以是外部二进制包,或者是其它的 Gradle 项目. 在本例中, app/build.gradle 中有 ...

  10. JMETER 使用JDBC查找数据作为参数

    有些情况下我们需要读取平台中的用户作为参数,比如用户ID作为参数进行压力测试,我们可以使用CSV文件,如果这样做,需要每一次 都构造文件,比较麻烦.如果可以查询数据库,将查出的数据作为参数循环传入的话 ...