【akka】akka框架介绍
一、背景
大型服务系统由于业务或功能的复杂性,为了维护和升级的便利,往往在架构上按对系统进行拆分,按不同功能拆分成不同的子服务,并进行分布式的部署。但在我们的实践中,对于服务间调用的容错、扩展性、并发性能等问题还需要做严谨的考虑或设计,而由于各种各样的原因工程师们的设计往往有所欠缺。
对于多线程编程,经常会出现的缺点:线程维护困难、子线程出错后难以恢复、线程阻塞时浪费时间和资源;另外对于密集的计算任务,我们的系统需要达到很高的并发性能,单机系统资源无法满足计算需求,而类似java的fork/join框架又很难在分布式环境下简易地对并发计算进行架构设计。
而akka框架非常适合解决上述问题。akka框架是一款高性能、高容错性的分布式并发应用框架。akka底层采用scala语言实现,并基于actor并发模型,天然拥有异步、分布式能力,且具有很好的并发性能和容错机制。
二、akka特点
akka典型的特点:
- 并发模型:基于actor模型,对并发进行高层次的抽象;
- 异步能力:基于actor模型进行通信,天然具有异步非阻塞的特点;
- 高容错性:通过父子actor监督机制进行容错处理,为akka分布式模型提供高容错特性;
- 轻量级: 每个actor只占300bytes左右的内存,1G内存即可容纳百万级数量的actor;
- 位置透明:akka对actor地址进行了抽象、屏蔽了本地地址和远程地址的差异,对开发者透明
- 持久化:actor状态或消息可以被持久化,在jvm宕机后actor可以恢复;
三、akka的actor模型
actor模型是对并发模型的高层次抽象,从底层屏蔽了线程、锁机制的管理,为应用开发提供了简单易用的高层次api。
actor模型.png
actor模型的几个特征:
- 程序的计算都在actor中进行。actor实例是程序的最小运算单元;
- actor之间只能通过消息进行通信。消息是异步传递的,每个actor都有一个邮箱,该邮箱接收其它actor发送的消息,actor实例从邮箱中取出消息进行处理。actor实例内部一次只能同步处理一个消息,因此可以安全的进行状态处理不用进行程序加锁。由于对消息的处理是异步的,所以发送完消息后可以立即返回进行下一步处理(当然也可以等待处理完成)。
- actor可以响应其它actor发送的消息,并可以更改本身的状态或行为、发送消息给其它actor、创建子actor、对其它actor进行监督
四、akka架构体系
在akka中,整个actor体系被抽象成一个公共的actor系统,即ActorSystem,ActorSystem是一个层级结构,通过"父监督"模式和DeathWatch模式限定了actor的管理策略。
akka还提供了诸多的配套组件,例如网络服务、持久化等。
ActorSystem
actor组件
akka中actor组件具有几个特征:
- actor引用(Actor Reference)
akka不能通过new的方式创建引用。代替new的方式是,通过actorOf(创建actor)或actorSelection(查找actor)等方式返回Actor对象引用。对开发者而言,actor位置透明(可能存在于本地或远程)。 - 状态(State)
actor在不同时刻的状态通常用变量来标识。akka在底层为每个actor抽象一个轻量级的执行“线程”,实现了对状态的隔离。 - 行为(Behavior)
actor在接受到消息后可以对消息进行处理,或者转发给其它actor处理。 - 监督策略 (Supervisor Strategy)
actorSystem是一个层级结构,父actor对子actor具有监管的能力,可以针对子actor的异常进行:恢复、重启、停止、失败上溯等处理方案,另外提供了One-For-One(默认,只对异常的子actor进行处理)和All-For-One(对所有子actor进行处理)两种监督策略。
邮箱
每个actor都拥有自己的邮箱,所有接受的消息会先进入邮箱,actor从邮箱中取出消息进行处理。akka自带多种邮箱类型,并提供RequiresMessageQueue接口供开发者自定义特定类型的邮箱。
路由
actor消息也可以通过路由进行发送,路由可以是一个Router对象,也可以是一个自包含的actor:管理者所有的Routee(路由目标)。开发者可以根据需要选择不同的路由类型,如:轮询、随机、广播等。
网络服务
提供远程actor和分布式集群的基础能力,包含I/O、网络通信、序列化配置、gossip通信协议、节点管理、集群分片等
http、websocket模块
akka提供了处理 http、websocket协议的基础模块,可以在此基础上进行开发。
持久化
akka提供actor的状态持久化方案,在程序出错、宕机等场景下进行恢复。
五、总结
akka具有异步、分布式、高容错等特性,适合作为分布式应用的基础开发框架,比如,目前比较火的流计算引擎flink也采用akka作为分布式通信框架。开发者也可以用akka打造自己分布式应用服务!