Actor-ES框架:Ray
并发
1. 并发和并行
- 并发:两个或多个任务在同一时间段内运行。关注点在任务分割。
- 并行:两个或多个任务在同一时刻同时运行。关注点在同时执行。
本文大多数情况下不会严格区分这两个概念,默认并发就是指并行机制下的并发。
2. 好处
随着多核处理器的出现,并发编程可以提高程序的性能(吞吐量和响应能力)。
3. 并发实现方式
共享内存模型
因为并发能提高程序的性能,为了解决并发的需求,许多编程语言提供了共享内存通信机制(本文称为共享内存模型),体现是引入了Thread(线程)等概念。线程的出现解决了两个问题,一是GUI出现后急切需要并发机制来保证用户界面的响应;二是互联网发展后带来的多用户问题。但编写正确的并发、容错、可扩展的程序并不容易,对开发人员要求比较高,需要开发人员有能力处理避免死锁、互斥等待、竞争条件等问题。 当对程序进行纵向扩展(Scale Up)和横向扩展(Scale Out)时,问题会变得更加复杂。
为什么这么难:
We believe that writing correct concurrent, fault-tolerant and scalable applications is too hard. Most of the time it’s because we are using the wrong tools and the wrong level of abstraction. ——Akka
译:
我们认为写正确的并发、容错、可扩展的程序如此之难,是因为我们用了错误的工具和错误的抽象。——Akka
开发人员采用共享内存模型进行并发编程时,需要特别关注共享的数据结构及线程间的资源竞争导致的死锁等问题,这是一个非常大的难点,Actor模型可以很大程度地解决这些问题。
Actor模型
Actor模型这么好,Actor模型是什么?
Actor模型是一个概念模型,用于处理并发计算。它定义了一系列系统组件应该如何动作和交互的通用规则,最著名的使用这套规则的编程语言是Erlang。
Actor由3部分组成:状态(State)+行为(Behavior)+邮箱(Mailbox),State是指actor对象的变量信息,存在于actor之中,actor之间不共享内存数据,actor只会在接收到消息后,调用自己的方法改变自己的state,从而避免并发条件下的死锁等问题;Behavior是指actor的计算行为逻辑;邮箱建立actor之间的联系,一个actor发送消息后,接收消息的actor将消息放入邮箱中等待处理,邮箱内部通过队列实现,消息传递通过异步方式进行。
Actor是分布式存在的内存状态及单线程计算单元,一个Id对应的Actor只会在集群种存在一个(有状态的 Actor在集群中一个Id只会存在一个实例,无状态的可配置为根据流量存在多个),使用者只需要通过Id就能随时访问不需要关注该Actor在集群的什么位置。单线程计算单元又保证了消息的顺序到达,不存在Actor内部状态竞用问题。
Actor框架--Orleans
Actor模型这么好,怎么实现?
可以通过特定的Actor工具或直接使用编程语言实现Actor模型,Erlang语言含有Actor元素,Scala可以通过Akka框架实现Actor编程。目前C#语言中有两类比较流行,Akka.NET框架和Orleans框架。本文主要关注Orleans框架。
Orleans是微软开发的开源、分布式、跨平台的Virtual Actor框架,可以方便C#开发者开发分布式、高扩张、高并发、低延时的应用程序。
架构落地
1. N-Tier架构(代表三层)
N-Tier架构的代表是三层架构,实际项目分了很多层,多数是三层的延伸。传统的三层体系结构包括无状态的前端,无状态的中间层和存储层。
这种架构存在两个比较大的问题:
- 由于存储层在延迟和吞吐量方面的限制,系统很难处理高并发的场景。这种结构下通常的办法是在中间层和存储层之间添加缓存层来提高性能。如果引入的是分布式缓存,又会引入状态同步问题,这时候就需要考虑如何精准快速的更新缓存。
- 这种无状态的N-Tier架构,中间层内独立的应用实体之间通信很不方便,当一个请求需要多实体之间调用时,为业务代码的实现带来了困难。
Actor在架构层面上提供了一个简单的方式来构建无锁分布式大规模的应用程序,而不需要学习和应用复杂的并发和分布式控制,有效的解决了上述两个问题。
Orleans提供了一种直接的方式构建有状态的中间层,大量的业务逻辑实体分布式地部署在集群中,彼此相互独立,又可以相互访问。
缺点:
Orleans技术很优秀,许多人想用,但是目前国内圈子里的资料很少,代码多是Demo,Actor初接触通常觉得不易理解,使得大家找不到Orleans落地的方式。
2. Event Sourcing
在Orleans中,actor中的数据(State)存在于内存中,内存中的数据在断电、重启的场景下会丢失,可以使用Event Sourcing技术解决这一问题,Actor的状态修改是由事件驱动的,事件被持久化起来,然后通过Event Sourcing的技术,还原特定Actor的最新状态到内存。不仅如此,Event Sourcing还会极大地降低系统的耦合性。
什么是事件溯源
一个对象从创建开始到消亡会经历很多事件,以前我们是在每次对象参与完一个业务动作后把对象的最新状态持久化保存到数据库中,也就是说我们的数据库中的数据是反映了对象的当前最新的状态。而事件溯源则相反,不是保存对象的最新状态,而是保存这个对象所经历的每个事件,所有的由对象产生的事件会按照时间先后顺序有序的存放在数据库中。
事件溯源:
不保存对象的最新状态,而是保存对象产生的所有事件。
通过事件溯源(Event Sourcing,ES)得到对象最新状态。
Actor内数据的修改,是ACID强一致性的;跨Actor的数据修改,是最终一致性的,通过EventSourcing实现。这样可以让我们最大化的降低并发冲突,从而最大化的提高整个系统的吞吐。Actor和DDD,CQRS,Event Soucing(事件溯源)设计模型有天然的融合性,基于Actor可以很好的进行以上实践。
EventSourcing的概念通常跟CQRS放在一起,CQRS/ES的概念常常出现在DDD中,在DDD中,有许多程序员向往的实现,但是里面的抽象概念比较多,只熟悉三层的开发人员很难驾驭这些概念,基于这些概念提出的架构设计更是难以捉摸,一些前辈为探索DDD最佳实践,开发了一些DDD框架,但实际项目中,很难保证系统性能。
Actor不好理解,CQRS/ES、DDD不好理解,恰恰这些技术交织在一起能很好的使彼此落地。
3. Ray
说了这么多,目的是为了引出Ray。
Ray是一个集成Actor、Event Sourcing(事件溯源)、Eventual Consistency(最终一致性)的无数据库事务、高性能分布式云框架。Ray是一个非常精致小巧的Actor/ES框架,来自生产环境,踩了很多坑,降低了Actor、ES的开发难度。
来自生产环境
ASP.NET Core、Redis、MongoDB、跨平台、gRPC、RabbitMQ、Dapper……许多朋友都掌握了,但依旧好像缺些什么,或许可以尝试一下新的旅程。这是项目的地址: https://github.com/RayTale, 欢迎大家讨论、参与、使用。
设计图
这张图方便大家初步了解Ray,但是太过强调细节,对DB太过突出,而Event没有突出出来。
这张图更简洁明了一些。
参考:
深度长文:我对CQRS/EventSourcing架构的思考
Actor-ES框架:Ray的更多相关文章
- 学界| UC Berkeley提出新型分布式框架Ray:实时动态学习的开端—— AI 应用的系统需求:支持(a)异质、并行计算,(b)动态任务图,(c)高吞吐量和低延迟的调度,以及(d)透明的容错性。
学界| UC Berkeley提出新型分布式框架Ray:实时动态学习的开端 from:https://baijia.baidu.com/s?id=1587367874517247282&wfr ...
- 解析分布式应用框架Ray架构源码
摘要:Ray的定位是分布式应用框架,主要目标是使能分布式应用的开发和运行. Ray是UC Berkeley大学 RISE lab(前AMP lab) 2017年12月 开源的新一代分布式应用框架(刚发 ...
- 框架Ray
高性能最终一致性框架Ray之基本概念原理 一.Actor介绍 Actor是一种并发模型,是共享内存并发模型的替代方案. 共享内存模型的缺点: 共享内存模型使用各种各样的锁来解决状态竞争问题,性能低下且 ...
- CQRS/ES框架调研
1.Enode一个C#写的CQRS/ES框架,由汤雪华设计及实现,github上有相关源码,其个人博客上有详细的孵化.设计思路.版本迭代及最新的完善: 2.axon framwork,java编写,网 ...
- 高性能分布式执行框架——Ray
Ray是UC Berkeley AMP实验室新推出的高性能分布式执行框架,它使用了和传统分布式计算系统不一样的架构和对分布式计算的抽象方式,具有比Spark更优异的计算性能. Ray目前还处于实验室阶 ...
- 高性能最终一致性框架Ray之基本概念原理
一.Actor介绍 Actor是一种并发模型,是共享内存并发模型的替代方案. 共享内存模型的缺点: 共享内存模型使用各种各样的锁来解决状态竞争问题,性能低下且让编码变得复杂和容易出错. 共享内存受限于 ...
- 高性能最终一致性框架Ray之基本功能篇
一.Event(事件) Event是Actor产生的记录状态变化的日志,由StateId(状态Id),UID(幂等性控制),TypeCode(事件类型),Data(事件数据),Version(事件版本 ...
- 取代 Python 多进程!伯克利开源分布式框架 Ray
Ray 由伯克利开源,是一个用于并行计算和分布式 Python 开发的开源项目.本文将介绍如何使用 Ray 轻松构建可从笔记本电脑扩展到大型集群的应用程序. 并行和分布式计算是现代应用程序的主要内容. ...
- 基于Actor模型的CQRS、ES解决方案分享
开场白 大家晚上好,我是郑承良,跟大家分享的话题是<基于Actor模型的CQRS/ES解决方案分享>,最近一段时间我一直是这个话题的学习者.追随者,这个话题目前生产环境落地的资料少一些,分 ...
随机推荐
- Linux目录结构介绍-http://yangrong.blog.51cto.com/6945369/1288072
1.树状目录结构图 2./目录 目录 描述 / 第一层次结构的根.整个文件系统层次结构的根目录. /bin/ 需要在单用户模式可用的必要命令(可执行文件):面向所有用户,例如:cat.ls.cp,和/ ...
- Linux内置命令
主要Shell内置命令 Shell有很多内置在其源代码中的命令.这些命令是内置的,所以Shell不必到磁盘上搜索它们,执行速度因此加快.不同的Shell内置命令有所不同. A.2.1 bash内置命令 ...
- 聚簇(或者叫做聚集,cluster)索引和非聚簇索引
字典的拼音目录就是聚簇(cluster)索引,笔画目录就是非聚簇索引.这样查询“G到M的汉字”就非常快,而查询“6划到8划的字”则慢. 聚簇索引是一种特殊索引,它使数据按照索引的排序顺序存放表中.聚簇 ...
- 解决mysql漏洞 Oracle MySQL Server远程安全漏洞(CVE-2015-0411)
有时候会检测到服务器有很多漏洞,而大部分漏洞都是由于服务的版本过低的原因,因为官网出现漏洞就会发布新版本来修复这个漏洞,所以一般情况下,我们只需要对相应的软件包进行升级到安全版本即可. 通过查阅官网信 ...
- Appsacn 定期自动化扫描
appscan提供了计划扫描的选项,配合windows的计划任务,可以按需设定. 操作流程如下: 1.打开Appsacn--工具---扫描调度程序---新建 2.新建后显示如下窗口 3.填写好相应的设 ...
- badboy 录制脚本并并发脚本
很久没有研究过接口相关的工具了,一个偶然的机会听说了 badboy,可以录制jemter脚本, 查了资料 还可以并发,于是乎,实践才知道. http://www.badboy.com.au/ 官网,我 ...
- 伽罗瓦域(有限域)GFq^12上元素的1→2→4→12塔式扩张(2)------第二次扩张
接上文https://www.cnblogs.com/heshuchao/p/8196307.html 继续探讨塔式扩张的第二部分,即1→2→4→12中2 → 4的元素扩张表示方式与计算公式推导. 3 ...
- Windows下使用OpenSSL生成自签证书
下载OpenSSLhttp://slproweb.com/products/Win32OpenSSL.html 生成证书 生成crt证书CMD进入安装bin目录,执行命令:openssl req -x ...
- Python day 7(2) 类和实例(1)
一:面向对象编程 1 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 2 ...
- TPYBoard V102:能跑Python的stm32开发板
近来micropython语言做硬件编程很火,随之而来的就开始带动着支持micropython语言编程的开发板也开始火的发烫,今天小编就来和大家介绍一款很经典的micropython开发板-TPYBo ...