Orleans 1 基本概念

Orleans分布式框架-1

一、痛点

传统应用常用的三层结构通常为:Web层-服务层-数据层(RDBMS或No-Sql),随着业务发展,数据库层通常会存在瓶颈,为了缓解数据库的压力,首先会在数据层上加一层缓存层,但缓存层对于海量数据输入的帮助不大。

随着业务继续发展,高并发、大数据量应用场景就凸显出来,如果继续在单体应用上进行扩展,能做的就是增加消息队列、异步、读写分离等,但优化空间不大,应用复杂度却迅速增加,对于应用维护也是潜在的定时炸弹。

另一个解决办法是既然单机部署不能满足需求,可以做成集群。通过对单体营养按照分层结构进行纵向分离,将数据库从应用服务器分离,将缓存从应用服务器分离,对分离的各个部分分别部署,再借助负载均衡完成集群效应。

补充:负载均衡

有若干种做法:

1、http重定向,用户发起的请求会传递至重定向服务器,重定向服务器根据一定的算法得到服务器集群一个真实服务器的地址,然后返回给用户,用户再和这个真是服务器联系。

2、dns解析,类似于http重定向,每次通过域名(www.google.com)访问网站时,通过dns得到服务器地址,此时可以在dns服务器上设置一定的算法,每次得到不同的ip地址返回给用户,用户再访问,实现负载均衡。

以上2种需要用户发起2次请求。

3、反向代理,vpn被称为正向代理,用户把请求交给代理服务器,代理服务器访问网站得到数据,之后代理服务器将数据返回个用户。应用服务器不知道用户的存在,只知道代理浏览器的访问。

反向单例是在服务端的代理,代理服务器接收用户的请求,再转发请求给真实服务器,之后再返回给代理服务器再给用户,这个过程中,用户不知道真实服务器的存在。Nginx就是反向代理服务

还有其他类型的负载均衡。

orleans模型本身也是一种负载均衡。

回到分布式上,虽然通过负载均衡和集群可以撑下去,但细分到业务上看,对一个复杂应用来说,通常的性能瓶颈就是几个核心服务,如果能对存在性能瓶颈的服务进行伸缩,就可以大大提高应用的整体可用性,又能提高资源的利用率,就是服务拆分。

服务拆分的一个结果就是云生应用。

云生应用最大的特点就是:

1、并行:同一时刻能够处理多个任务。云生应用本身就是以多个服务形式提供服务,自然是并行的。

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

云生应用虽然进一步拆分了有性能瓶颈的业务,通过服务拆分支持了并行,但实现的技术复杂度却提高了。

二、解决思路

如何进行服务拆分,才能确保其能分布式部署,或是水平伸缩

把应用/服务设计成无状态的。

OOP本身是对现实事物的抽象和封装,但封装出来的对象本身是没有生命力的,只有在程序运行中对类进行实例化得到一个对象的实例时,才可以说这个实例对象是有状态和行为的,因为这个状态和行为是独有的。

如果一个对象的状态属性是长期性的,那么就可以说这个对象是有状态的。

对于应用来说,当运用运行时持有的数据能够持久化,就称其为有状态的。

三、Actor模型

解决高并发的难点在于:

1、高性能

2、数据一致性问题

解决高性能可以通过水平扩展服务化解,解决第二个问题,就是锁,但分布式场景下,锁会大大降低应用的整体性能。

如果要兼顾性能,又确保数据一致性,就借助Actor模型。

Actor=状态+行为+消息

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

Actor还基于时间驱动模型进行异步通信,性能良好,位置透明。

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

四、Orleans

orleans的高开发效率在于:

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

2、Grain透明实例化:应用无需关心Actor实例的创建、销毁,可以直接调用Actor提供的方法。Actor的声明周期由Virtual Actor运行时进行管理,类似GC,Actor类似于托管状态。

3、Grain位置透明:Actor之间通过逻辑引用(非实例引用)互相调用,而不需要知道Actor所处的实际位置。

4、Grain单线程执行

5、Grain状态透明存储

6、异常的自动传播

透明可伸缩体现在:

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

2、自适应的资源管理:Grain生命周期由Orleans托管

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

4、高效调度

5、显式异步

Orleans所使用的的Actor模型(Virtual Actor模型)具有处理高并发和数据一致性的优势,它能够确保每个Grain都是独立运行(单线程)和可寻址的,也能够根据业务量,动态的增加Grain服务或销毁不必要的Grain服务,达到高性能的目的。

五、Orleans的核心角色

1、Grain

Grain是一个可寻址的隔离的.NET对象实例(可寻址并非是new一个对象的内存引用,因为面向集群的任一机器,简单的内存寻址是无法跨机器寻址的,实际上是通过Grain Identity实现)。

集群中的Grain的唯一性由Grain Type+Grain Identity组成。

Grain可以理解为一个服务,类似UserService、AccountService,是主要的业务逻辑实现与抽象

2、Silo

Silo相当于一台服务器,用于存储Grain,Grain开发完成后需要注册到Silo中,等待调用

Grain的声明周期由Silo管理,Grain的声明周期如下:

销毁->持久化->激活->在内存中激活->销毁

其他的Grain或Client会调用目标Grain,Silo运行时去激活Grain(若Grain有状态,激活时会同时恢复状态),Grain处理调用请求,Grain闲置,Silo运行时决定是否销毁Grain,销毁Grain并从内存中移除(如果Grain有状态,则需要持久化Grain状态,以便下次激活时恢复状态)

Grain作为orleans中的最小执行单元,需要一个运行时去暴露,Silo就是最小的向外提供服务的单元。Silo会通过将相关的Grain进行组装,暴露一组服务,并在运行时管理Grain的声明周期。

Silo本身是可以跨平台的。Silo集群是指多个Silo组成的集群,而非多个Orleans Server组成的集群。

3、Client

具体的应用客户端,Console,Web Application、WPF等.NET端技术。

posted @ 2020-06-10 14:20  NicolasLiaoRan  阅读(1634)  评论(2编辑  收藏  举报