.NET分布式框架 | Orleans 知多少

640?wx_fmt=other

引言

公司物联网项目集成Orleans以支持高并发的分布式业务,对于Orleans也是第一次接触,本文就分享下个人对Orleans的理解。

这里先抛出自己的观点:Orleans 是一个支持有状态云生应用/服务水平伸缩的基于Virtual Actor 模型的.NET分布式框架。

下面我会从以下几个关键点,进行阐述:

  1. 云生应用的挑战

  2. 何为有状态/无状态

  3. 什么是 Actor 模型

  4. 什么是 Virtual Actor 模型

云生应用的挑战

在讲云生应用之前,我们来先讲讲传统应用,对于传统应用常用的三层结构如下图所示。640?wx_fmt=png

随着业务的发展,数据库层通常存在瓶颈,为了缓解数据库的压力,一般会优先考虑增加一层缓存层。

640?wx_fmt=png

而随着业务的继续发展,高并发、大数据量的应用场景逐渐凸显。如果继续在单体应用的基础上进行扩展,能做的无非是增加消息队列、异步、读写分离等机制进行性能优化。总体而言,优化空间不大,但应用的整体复杂度却随着引入的新的技术框架而迅速增加,对于应用的维护,是一个潜在的定时炸弹。

这个时候你可能会想,既然单体应用单机部署不能满足需求,我可以做集群啊。通过将单体应用按照分层结构进行纵向分离,将数据库从应用服务器分离,将缓存从应用服务器分离。这样就可以对分离的各个部分进行分别部署,再借助负载均衡完成集群效应。到这一步,你的应用应该能撑一段时间了。

这个时候,如果回到业务本身去分析,对于一个复杂应用来说,通常的性能瓶颈就是几个核心服务上。如果能够对存在性能瓶颈的服务进行伸缩,既能大大提高应用的整体可用性又能提高资源的利用率。那怎么做呢?服务拆分。

云生应用就是服务拆分的结果,云生应用最大的特点就是:

  • 并行:是指同一时刻能够处理多个任务。这无可厚非,云生应用以多个服务形式提供服务,自然是支持并行的。

  • 分布式:是指一个应用/服务多次部署,以应对高并发,提升应用/服务的整体性能。

或者简单来说,云生应用通过服务拆分支持服务并行,同时各个服务能够快速伸缩以提升系统吞吐量来应对高并发的业务场景。

虽然通过服务拆分简化了整个应用的业务复杂度,但是实现的技术复杂度却只增不减。

有状态 Vs 无状态

转向云生应用我们面对的第一个难题就是:如何进行服务拆分,才能确保其能分布式部署,或者说是水平伸缩?!

有经验的同学,可能会立马想到,要将应用/服务设计为无状态的。但是这里我要向你讨教几个问题:

  1. 这个状态是指什么?

  2. 何为有状态?

  3. 何为无状态?

大家不妨先停下来思考一下。(欢迎大家在评论中阐述不同观点。)

这里,我尝试从以下两个角度来谈下自己的看法:

1. 对象

面向对象编程强调的是对现实事物的抽象和封装。通过对事物状态和行为进行抽象然后封装为对象(类),其中状态封装为类的属性、字段,将行为封装为类的方法。这个时候得到的对象是没有生命力的,因为它本质是一个抽象的结果。只有在程序运行中对类进行实例化得到一个对象的实例时,才可以说这个实例对象是有状态和行为的,因为这个状态和行为是其独自持有的,这是一个非常核心的条件。独自持有,换句话说,就是非共享成员。独自持有非共享的成员就可以说这个对象实例是有状态的吗?这里面你就要看清状态有状态的区别!举个简单例子,大街上你看到一大叔开着豪车,你觉得他很富有。“开着豪车”是你即时看到的状态属性。“富有”是你的状态断言。但这个状态断言是一个假设,毕竟可能是借的嘛。怎样才能断定“富有”就是这位大叔拥有的状态呢?很简单,假设一年365天你天天见到他开豪车,那基本八九不离十了。

所以,如果认定一个对象是否有状态,还要看其状态属性是否持久化!

如果你同意这个观点,那么哪天你看我骑个共享单车,气喘吁吁从你面前经过,就不要简单认为我是苦逼工薪族。毕竟我也是身价上千万,只是偶尔骑个车锻炼锻炼。(身价上千万,昨晚梦到的。)

所以,从对象角度看,一个对象是否有状态的充分必要条件是:

  1. 对象已实例化(处于运行时)

  2. 拥有非共享的状态属性

  3. 状态持久化

那问题来了,我们经常写的类创建的实例,是有状态的吗?

2. 应用

基于上面的总结,我们再来从应用的角度来看分析这个问题。

那应用的状态和行为是什么?首先,只有运行中的应用才有状态和行为。基于这个前提,个人理解运行时应用的状态是应用持有的数据,行为是应用提供的功能。那应用的有无/无状态界定就要看运行时应用持有的数据能否持久化。

以简单的Web分层应用举例 。从逻辑架构上来讲应用一般分为三层,表示层、业务层和数据访问层。上层进行状态行为的封装,数据层提供数据的持久化。所以从整体的角度来看,其是一个有状态的应用。但单独来看,我们不能对每一层进行有/无状态的界定。第一,每一层不能单独运行;第二,分层的目的是为了职责的隔离,每一层负责相应职责的抽象和封装,其输出的是类文件,是对象的集合,没有生命力。

那从物理架构上来讲,Web应用可以分开两个部分进行部署:Web实例和MySQL实例。也就是说应用和数据库是可以分开部署的。这个时候Web实例就是无状态的。那我们一般常说的无状态服务其实是就是从这个拆分的角度来说的。

Actor 模型

理清完服务拆分的核心问题后,我们不得不来处理第二个棘手的问题:如何解决云生应用高并发的应用场景呢?那首先我们需要明确处理高并发的难点在哪?第一个是高性能,第二个就是:资源竞争导致的数据一致性问题。对于第一个难点,通过水平扩展服务可以化解;对于第二个难点,一般就是采用锁机制,而对于云生分布式的应用场景下,处理手段就更加复杂,可能需要使用分布式锁,而这种做法,大大降低了应用的整体响应性能。那有没有更好的解决方案,既兼顾性能又可以确保数据一致性呢?

有,借助Actor模型。

简单来讲:Actor模型 = 状态 + 行为 + 消息。一个应用/服务由多个Actor组成,每个Actor都是一个独立的运行单元,拥有隔离的运行空间,在隔离的空间内,其有独立的状态和行为,不被外界干预,Actor之间通过消息进行交互,而同一时刻,每个Actor只能被单个线程执行,这样既有效避免了数据共享和并发问题,又确保了应用的伸缩性。

另外Actor基于事件驱动模型进行异步通信,性能良好。且位置透明,无论Actor是在本机亦或是在集群中的其他机器,都可以直接进行透明调用。

因此Actor模型赋予了应用/服务的生命力(有状态)、高并发的处理能力和弹性伸缩能力。

640?wx_fmt=png

Virtual Actor 模型 与 Orleans

对于Actor模型,业界已经有系列的实现框架,比如Erlang、Akka。然而Actor模型作为一个偏底层的技术框架,对于开发者来说,需要有一定分布式应用的开发经验,才能用好Actor(包括Actor的生命周期管理,状态管理等等)。为了进一步简化分布式编程,微软的研究人员引入了 Virtual Actor 模型概念,简单来讲Virtual Actor模型是对Actor模型的进一步封装和抽象。其与Actor模型的最大的区别在于,Actor的物理实例完全被抽象出来,并由Virtual Actor所在的运行时自动管理。

Orleans 就是作为一款面向.NET的Virtual Actor模型的实现框架,提供了开发者友好的编程方式,简化了分布式应用的开发成本。在Orleans中Virtual Actor由Grain来体现。

Orleans中核心优势:开发效率高、透明可伸缩。

开发效率高具体表现为:

  1. 面向对象的编程范式去实现Grain

  2. Grain单线程执行

  3. Grain透明实例化:换句话说,应用无需关注Actor实例的创建、销毁,可以直接调用Actor提供的方法。Actor的生命周期由Virtual Actor 运行时进行管理,类似GC,可以把Actor理解为完全托管的状态。

  4. Grain位置透明:Actor之间通过持有彼此的逻辑引用(非实例引用)进行相互调用,而不需要知道Actor所处的实际位置。

  5. Grain状态透明存储

  6. 异常的自动传播

透明可伸缩体现为:

  1. 应用状态的隐式细粒度划分

  2. 自适应的资源管理:Grain的生命周期完全由Orleans 运行时托管。

  3. 多路通信:Grain的位置透明,Grain之间通过一组固定的TCP链接进行多路复用来进行消息传递。

  4. 高效调度

  5. 显式异步

最后

这篇文章,就简单写到这里,对于Orleans的详细介绍后续会结合实际项目输出更系统的应用细节,下次再见。

640?wx_fmt=jpeg


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

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

相关文章

nowcoder 牛牛的最大兴趣组 质因子 + 思维

传送门 文章目录题意:思路:题意: 思路: 首先nnn很小的话可以暴力连边,让后染个色求一个颜色最多的即可。但是这个题显然不行,由于是三次方,所以考虑质因子入手。 首先很容易就能想到将所有的数…

ASP.NET Core on K8S学习初探(3)部署API到K8S

“ 终于可以部署ASP.NET Core到K8S中了...”在上一篇《基本概念快速一览》中,我们把基本的一些概念快速地简单地不求甚解地过了一下,本篇开始我们会将ASP.NET Core WebAPI部署到K8S,从而结束初探的旅程。01—准备一个WebAPI这里准备一个空的A…

K-D Tree学习笔记

引入 K-D Tree 是一种处理高维空间的数据结构。 支持O(nk−1k)O(n^{\frac {k-1}k})O(nkk−1​)查询给定超矩形内的点的信息, kkk 为维数。 可以用替罪羊树的思想实现动态插入。 但其实用的最多的是在错误的复杂度内查询奇奇怪怪的点信息。 构建 K-D Tree 是平…

Codeforces Round #633 B. Edge Weight Assignment 结论题 + dp

传送门 文章目录题意:思路:题意: 思路: 首先考虑最小值,如果从一个叶子结点出发到任意叶子的距离都为偶数,那么只需要一个值就可以满足条件。如果有奇数的,考虑111 ^ 222 ^ 303030,…

ASP.NET Core Web API中使用Swagger

本节导航Swagger介绍在ASP.NET CORE 中的使用swagger在软件开发中,管理和测试API是一件重要而富有挑战性的工作。在我之前的文章《研发团队,请管好你的API文档》 也专门阐述了通过文档管理工具,来保证API文档和代码的一致性,这样更加有助于团队的协作。以往我们总是通过第三方平…

【ZJOI2015】幻想乡战略游戏【点分树】【带权重心】

题意:nnn个点带边权的树,动态修改点权viv_ivi​,最小化 钦定一个点xxx 后 ∑idist(x,i)∗vi\sum\limits_{i} dist(x,i)*v_ii∑​dist(x,i)∗vi​的值。 n,q≤105n,q \leq10^5n,q≤105,度数不超过202020 限制度数的树上的一些诡异…

NuGet是什么?理解与使用

如果你了解python,那么它类似pip。如果你了解nodejs,那么它类似npm。如果你了解ruby,那么它类似gem。对,它就是一个包(package)管理平台,确切的说是 .net平台的包管理工具,它提供了一…

P2468 [SDOI2010]粟粟的书架 主席树 + 二分 + 二维前缀和

传送门 文章目录题意:题意:题意: 给你一个n∗mn*mn∗m的矩阵,每次询问一个矩形,左上角是(x1,y1)(x_1,y_1)(x1​,y1​),右上角是(x2,y2)(x_2,y_2)(x2​,y2​),和一个hhh,问是否能选出…

带花树学习笔记

引入 带花树解决的是一般图的最大匹配问题。 学习此算法前你需要掌握二分图匹配的匈牙利算法,至少需要知道它的思想。 理论 众所周知,二分图匹配的思想是不断地找增广路。 严谨地讲,是找到了一条简单路径,它的起点和终点都未…

你竟然没用 Nuget 构建项目?

想写这篇文章缘起于公众号文章里的一条留言:对于一个现代化的开发平台,建立一种让开发者创建,分享与使用可复用代码的机制是十分必要的。这种“可复用代码”被打包后的文件通常被称作“包”(package),对于.…

Codeforces Round #339 (Div. 1) D. Kingdom and its Cities 虚树 + dp

传送门 文章目录题意:思路:题意: n≤1e5,∑k≤1e5,q≤1e5n\le1e5,\sum k\le1e5,q\le1e5n≤1e5,∑k≤1e5,q≤1e5。 思路: 经过分析,外敌占领的城市只有可能是两点的lcalcalca或者两点之间任意一点,是哪个点…

小白开学Asp.Net Core《四》 —— 使用AspectCore-Framework

小白开学Asp.Net Core《四》—— 使用AspectCore-Framework一、AspectCore-Framework说AspectCore-Framework不得不先谈谈的AOP,AOP:在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通…

P4103 [HEOI2014]大工程 虚树 + dp

传送门 文章目录题意:思路:题意: 思路: 简化一下题意就是求树上给定点集中每两个点之间的距离之和,相距最远的点,相距最近的点。 对于距离和我们统计一下边的贡献就好啦,边两头的sizesizesize乘…

【翻译】Keras.NET简介 - 高级神经网络API in C#

用C#,远离996Keras.NETKeras.NET是一个高级神经网络API,它使用C#编写,并带有Python绑定,可以在Tensorflow、CNTK或Theano上运行。其关注点是实现快速实验。因为做好研究的关键是:能在尽可能短的时间内从一个想法发展出…

TIOBE 6月排行:C# 以微弱的优势超过了 Visual Basic .NET 的排名,再次进入 TOP 5

月经贴警告……TIOBE 编程语言排行榜 7 月更新已公布,排名前十的分别是:Java, C, Python, C, C#, Visual Basic .NET, JavaScript, PHP, SQL 和汇编语言。和上个月的不同之处主要是 C# 以微弱的优势超过了 Visual Basic .NET 的排名,再次进入…

用.NET Core实现一个类似于饿了吗的简易拆红包功能

需求说明以前很讨厌点外卖的我,最近中午经常点外卖,因为确实很方便,提前点好餐,算准时间,就可以在下班的时候吃上饭,然后省下的那些时间就可以在中午的时候多休息一下了。点餐结束后,会有一个好…

kubernetes实战篇之helm示例yaml文件文件详细介绍

前面完整示例里,我们主要讲解helm打包,部署,升级,回退等功能,关于这里面的文件只是简单介绍,这一节我们详细介绍一下这里面的文件,以方便我们参照创建自己的helm chart.Helm Chart 结构Chart 目录结构mychart/ Chart.yaml LICENSE README.md values.yaml requirements.yam…

P4309 [TJOI2013]最长上升子序列 平衡树 + dp

传送门 文章目录题意:思路:题意: 思路: 注意到一个很关键的条件,每次插入iii,而iii是递增的,也就是说插入iii之后只会从前面的最大值转移过来,所以我们现在只需要维护插入操作即可&…

【AGC035C】Skolem XOR Tree【异或】【构造】

传送门 题意:给定nnn,构造或判断无法构造一个2n2n2n个结点的树,其中结点iii和ininin的权值为iii,且所有iii和ininin路径权值异或和等于iii。 注意到 2i⊕2i112i\oplus2i112i⊕2i11,然后可以脑补出 然而111没处理 发现1⊕2⊕301\…

ASP.NET Core 管道再探

几乎任何服务器端处理环境都有自己的直通组件管道,用于检查、重路由或修改传入请求和传出响应。经典 ASP.NET 围绕 HTTP 模块理念进行排列,而 ASP.NET Core 采用基于中间件组件的更现代的体系结构。最终目的是相同的 - 允许可配置的外部模块以请求&#…