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还会极大地降低系统的耦合性。

什么是事件溯源

一个对象从创建开始到消亡会经历很多事件,以前我们是在每次对象参与完一个业务动作后把对象的最新状态持久化保存到数据库中,也就是说我们的数据库中的数据是反映了对象的当前最新的状态。而事件溯源则相反,不是保存对象的最新状态,而是保存这个对象所经历的每个事件,所有的由对象产生的事件会按照时间先后顺序有序的存放在数据库中。


事件溯源:

  1. 不保存对象的最新状态,而是保存对象产生的所有事件。

  2. 通过事件溯源(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没有突出出来。

这张图更简洁明了一些。


参考:

Orleans Github文档

并发之痛 Thread,Goroutine,Actor

高并发解决方案之Actor——第一节

.NET的Actor模型:Orleans

下一代的 Actor 模型框架 Proto Actor

10 分钟了解 Actor 模型

为什么Actor模型是高并发事务的终极解决方案?

深度长文:我对CQRS/EventSourcing架构的思考

原文地址:http://www.cnblogs.com/CharlesZHENG/p/8327388.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sentinel(十五)之在生产环境中使用 Sentinel

转载自 在生产环境中使用 Sentinel 引言 Sentinel 目前已可用于生产环境,除了阿里巴巴以外,也有很多企业在生产环境中广泛使用 Sentinel。 生产环境的 Sentinel Dashboard 需要具备下面几个特性: 规则管理及推送,集中管理和推送规则。se…

P3934-Nephren Ruq Insania【欧拉定理,树状数组】

正题 题目链接:https://www.luogu.org/problemnew/show/P3934 题目大意 长度为nnn的序列aaa 1lrw:1\ l\ r\ w:1 l r w:让l∼rl\sim rl∼r这个区间增加www。2lrp:2\ l\ r\ p:2 l r p:求alal1al2...%pa_l^{a_{l1}^{a_{l2}^{...}}}\% palal1al2...​​​%p直到ara_rar​ 解题思路…

Entity Framework Core 懒加载

众所周知在EF 6 及以前的版本中,是支持懒加载(Lazy Loading)的,可惜在EF Core 并不支持,必须使用Include方法来支持导航属性的数据加载。不过现在EF Core的开发团队打算恢复对这一功能的支持(目前还未发布&…

Sentinel(十六)之AHAS Sentinel 控制台

转载自 AHAS Sentinel 控制台 AHAS Sentinel 是 Sentinel 的阿里云上版本,提供企业级的高可用防护服务,包括: 可靠的实时监控和历史秒级监控数据查询,包含 QPS、RT、load、CPU 使用率等指标,支持按照调用类型分类&a…

和各路巨佬の随机挑战3总结

第三次挑战\huge \texttt{\color{purple}第\color{blue}三\color{green}次\color{block}挑\color{red}战}第三次挑战 规则 随机挑取一蓝一紫一黑来做,拥有两次换题机会,若黑题是暂未学过的算法可以拥有无限次换题机会。 van♂van♂van♂成记录 过程 晚…

浅析Entity Framework Core2.0的日志记录与动态查询条件

一、 Entity Framework Core2.0的日志记录早在Entity Framework Core1.0 ,我们就使用相关的ILoggerProvider ILogger 这些基础接口类.来实现过日志记录.在Entity Framework Core2.0 估计是为了配合ASP.NET Core的日志.所以对这些接口进行了更进一步的包装,也弃用了一些接口和类…

Sentinel(十七)之启动配置项

转载自 启动配置项 配置方式 Sentinel 提供如下的配置方式: JVM -D 参数方式properties 文件方式(1.7.0 版本开始支持) 其中,project.name 参数只能通过 JVM -D 参数方式配置(since 1.8.0 取消该限制)&…

jzoj3337-[NOI2013模拟]wyl8899的TLE【字符串hash,二分】

正题 题目大意 两个字符串A,BA,BA,B。可以修改AAA中的一个字符使得AAA中的1∼k1\sim k1∼k是BBB的子串,求kkk的最大值。 解题思路 先将AAA和BBB字符串hashhashhash,然后枚举BBB作为子串的起始位置,然后二分出不修改字符的第一个不相等处xxx…

Actor-ES框架:Ray--事件(Event)编写说明

Event作用:存储事件数据。IEventBaseK:是Actor的StateId的类型,可以是long、可以是string,Ray一般使用OGuid生成的字符串作为主键。编写Event继承IEventBase接口,Base部分如下: public string Id {…

Sentinel(十八)之注解支持

转载自 注解支持 Sentinel 提供了 SentinelResource 注解用于定义资源&#xff0c;并提供了 AspectJ 的扩展用于自动定义资源、处理 BlockException等。使用 Sentinel Annotation AspectJ Extension 的时候需要引入以下依赖&#xff1a; <dependency><groupId>c…

jzoj3338-[NOI2013模拟]法法塔的奖励【权值线段树,线段树合并】

正题 题目大意 一棵树&#xff0c;对于每个点&#xff0c;求从任何一个在该点的子树为头&#xff0c;以该点为结尾的序列必须选择这个点的最长不降子序列。 解题思路 首先我们使用权值线段树计算答案每个点(l,r,w)(l,r,w)(l,r,w)表示以l∼rl\sim rl∼r为结尾最长的不降升子序…

设计模式之策略模式在地铁票价系统中的应用

引言设计模式是面向对象编程的一个非常精彩的部分。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性&#xff0c;它能帮助我们将应用组织成容易了解&#xff0c;容易维护&#xff0c;具有弹性的架构。本文通过一个简单的案例来讲述策略模式在地铁票价系…

jzoj3339-[NOI2013模拟]wyl8899和法法塔的游戏【博弈论,暴力】

正题 题目大意 有nnn堆石子&#xff0c;每次选择一个区间博弈&#xff0c;先手必须先取最右边的石子堆。 每次询问(r,a,b)(r,a,b)(r,a,b)表示在a∼ba\sim ba∼b中选择一个数lll。要求使用l∼rl\sim rl∼r这个区间的石子进行博弈&#xff0c;然后若先手必胜输出最右边的石子需…

Sentinel(十九)之主流框架的适配

转载自 主流框架的适配 注&#xff1a;适配模块仅提供相应适配功能&#xff0c;若希望接入 Sentinel 控制台&#xff0c;请务必参考 Sentinel 控制台文档。 云原生微服务体系 Spring Cloud Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。Sentinel 与 Spring …

利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏

【先上一张效果图】&#xff1a;一、原理&#xff1a;其实原理很简单&#xff1a;1.手机投屏到电脑&#xff1b;2.截取投屏画面的题目部分&#xff0c;进行识别&#xff0c;得到题目和三个答案&#xff1b;3.将答案按照一定的算法&#xff0c;进行搜索&#xff0c;得出推荐答案…

Sentinel(二十)之Envoy RLS Token Server

转载自 Envoy RLS Token Server Sentinel 提供了一个 Envoy Global Rate Limiting gRPC Service 的实现 sentinel-cluster-server-envoy-rls&#xff0c;借助集群限流 token server 来为 Envoy 服务网格提供集群流量控制的能力。 Note: You can refer to here for the Englis…

欢乐纪中某A组赛【2019.7.9】

前言 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 心态大崩 ZYCdalaoZYCdalaoZYCdalao去AKBAK\ BAK B组了所以应该是我垫…

g4e基础篇#5 创建分支和保存代码

使用版本控制系统最常见的工作流程就是修改代码&#xff0c;保存代码&#xff0c;共享代码。Git提供了一个简单的3步工作流&#xff0c;让你方便的完成这些操作。1. 新建工作分支2. 提交更改3. 推送分支到中心存储库与团队成员共享Git 工作流按照以上3步操作&#xff0c;我们就…

P3952-时间复杂度【模拟】

正题 题目链接:https://www.luogu.org/problemnew/show/P3952 题目大意 比较复杂就直接给截图了 解题思路 开一个栈来维护序列&#xff0c;因为它保证合法的程序中一个变量不会相互嵌套所以就拿变量的字母当做每个循环的下标即可。然后对于输入的x,yx,yx,y有五种情况 xN,yN…

Sentinel(二十一)之Sentinel Dashboard控制台日志路径设置

一、sentinel-dashboard配置文件 配置文件内容&#xff1a;Sentinel/sentinel-dashboard/src/main/resources/application.properties #spring settings spring.http.encoding.forcetrue spring.http.encoding.charsetUTF-8 spring.http.encoding.enabledtrue#cookie name se…