Akka框架——第一节:并发编程简介

  • 时间:
  • 浏览:1
  • 来源:万人红黑大战棋牌_万人红黑大战棋牌官网

本节主要内容:

1. 重要概念

2. Actor模型

3. Akka架构简介

3 Akka并发编程框架

Scala语言中原生地支持Actor模型,只不过功能还不足强大,从Scala 2.10版本然后,Akka框架成为Scala包的一次责,可不都要在守护程序运行运行中直接使用。Akka框架作为Akka是一十十几个 以Actor模型为基础构建的基于事件的并发编程框架,底层使用Scala语言实现,提供Java和Scala有并不是API,它属于LightBend公司(原Typesafe公司)体系社会形态的一次责,如图5所示。



图5 Lightbend 体系社会形态[ ]

Akka框架意在多样化高并发、可扩展及分布式应用守护程序运行运行的设计,它具有如下优势:

(1) 使用Akka框架编写的应用守护程序运行运行既可不都要横向扩展(Scale Out)、也可纵向扩展(Scale Up)。

(2) 编写并发应用守护程序运行运行更简单,Akka提供了更高的抽象,开发人员只都要专注于业务逻辑,而后会像Java语言那样都要处理底级语义如守护程序运行运行、锁及非阻塞IO等。

(3) 高容错,Akka使用“let it crashes”机制,当Actor出错时可不都要快速恢复。

(4) 事件驱动的架构,Akka中的Actor之间的通信采用异步消息发送,还可不可以完美支持事件驱动。

(5) 位置透明,无论是Actor运行在本地机器还是远程机器上,对于用户来说都是透明的,这极大地多样化了多核处理器和分布式系统上的应用守护程序运行运行编程。

(6) 事务支持能力,支持软件事务内存(software transactional memory,STM),使Actor具有原子消息流的操作能力。

Akka框架由下列八个组件构成:

(1) akka-actor :包括经典的Actor、Typed Actors、IO Actor等

(2) akka-remote:远程Actor

(3) akka-testkit:测试Actor系统的工具箱

(4) akka-kernel :Akka微内核,用于运行精简的微型应用守护程序运行运行服务器,后会运行于Java应用服务器上。

(5) akka-transactor :Transactors 即支持事务的 actors,集成了Scala STM

(6) akka-agent – 代理, 同样集成了Scala STM

(7) akka-camel – 集成Apache Camel

(8) akka-zeromq – 集成ZeroMQ 消息队列

(9) akka-slf4j – 支持SLF4J 日志功能

(10) akka-filebased-mailbox – 支持基于文件的mailbox

多核处理器的老出使并发编程(Concurrent Programming)成为开发人员必备的一项技能,或多或少现代编程语言都致力于处理并发编程难题。并发编程其实还可不可以提高守护程序运行运行的性能,但传统并发编程的共享内存通信机制对开发人员的编程技能要求很高,都要开发人员通过自身的专业编程技能去处理死锁、互斥等待英文及竞争条件(Race Condition)等,熟悉Java语言并发编程的读者们对哪此难题的理解会比较深刻,哪此难题使得并发编程比顺序编程要困难得多。

Scala语言并没法直接使用Java语言提供的并发编程库,也不 通过Actor模型来处理Java并发编程中遇到的各种难题,为并发编程提供了更高级的抽象。

1 重要概念

(1)并发和并行

并发和并行从宏观来看,都是为进行多任务运行,但并发(Concurrency)和并行(parallelism)两者之间是有区别的。并行是指一十十几个 可能一十十几个 以上任务在同一时刻共同运行,;而并发是指一十十几个 或一十十几个 以上的任务在同一时间段内运行,即一十十几个 时间段含有十十几个 任务都所处已启动运行到运行完毕之间,这若干任务在同一CPU上运行但任一十十几个 时刻点还可不可以能了一十十几个 任务运行。图121给出了多核处理器下的现代操作系统守护程序运行运行和守护程序运行运行模型,图中守护程序运行运行2的守护程序运行运行1被调用度到处理器的核2上运行、守护程序运行运行3的守护程序运行运行1被调度到处理器的核3上运行,守护程序运行运行2的守护程序运行运行1和守护程序运行运行3的守护程序运行运行1是并行的,它们可不都要共同运行,而守护程序运行运行1的守护程序运行运行1和守护程序运行运行2都调度到处理器的核1上运行,此外它们还共享守护程序运行运行1的内存空间,在运行时面临着资源竞争包括CPU、内存及其它如IO等,它们在同一然还可不可以能了运行一十十几个 ,但在一段时间内都可不都要运行,然后守护程序运行运行1的守护程序运行运行1和守护程序运行运行2是并发执行的。



图1 守护程序运行运行、守护程序运行运行模型

(2)横向扩展和纵向扩展

所谓纵向扩展(Scale Up)指的是增加守护程序运行运行的进度或守护程序运行运行数量,提高守护程序运行运行的并发性;而横向扩展(Scale Out)指的是守护程序运行运行可不都要扩展到其它机器上运行,即通过分布式系统来提到守护程序运行运行的并行度。传统的Java并发编程模型不容易进行纵向扩展,然后并发的守护程序运行运行数不要 ,守护程序运行运行行为便会变得先要理解和控制,更多的守护程序运行运行加入到资源竞争,老出死锁等清况 的概率增加。横向扩展比纵向扩展困难更大,此时的守护程序运行运行变为分布式环境下的应用,清况 更为多样化,对开发人员的要求更高。Scala提供的Actor模型可不都要处理并发应用守护程序运行运行的横向扩展和纵向扩展难题,如图2、图3给出了基本Actor模型的横向扩展和纵向扩展。



图2 纵向扩展



图3 横向扩展

Scala学习(公众微信号:ScalaLearning)每天为一群人带来或多或少Scala语言、Spark、Kafka、Flink、AKKA等大数据技术干货及相关技术资讯。技术永无止境,勇攀高峰,一往直前!

其实文章不错?扫描关注

2 Actor模型

在使用Java语言进行并发编程时,都要很重关注共享的数据社会形态,守护程序运行运行间的资源竞争容易由于死锁等难题,而Actor模型便是要处理守护程序运行运行和锁带来的难题,Actor是有并不是基于事件(Event-Based)的轻量级守护程序运行运行,在使用Actor进行并发编程时只都要关注代码社会形态,而不都要过分关注数据社会形态,然后Actor最大限度地减少了数据的共享。 Actor由一十十几个 重要次责组成,它们是清况 (state),行为(Behavior)和邮箱(Mailbox),Actor与Actor之间的交互通过消息发送来完成,Actor模型如图4所示,清况 指的是Actor对象的变量信息,它可不都也不 Actor对象中的局部变量、占用的机器资源等,清况 只会根据Actor接受的消息而改变,从而处理并发环境下的死锁等难题;行为指的是Actor的计算行为逻辑,它通过处理Actor接收的消息而改变Actor清况 ;邮箱(mailbox)建立起Actor间的连接,即Actor发送消息后,另外一十十几个 Actor将接收的消息放上去到邮箱中待后期处理,邮箱的实物实现是通过队列来实现的,队列可不都也不 有界的(Bounded)也可不都也不 无界的(Unbounded),有界队列实现的邮箱容量固定,无界队列实现的邮箱容易不受限制。



图4 Actor模型

先要看出,Actor模型是对现实世界的层厚抽象,它具有如下特点:(1)Actor之间使用消息传递机制进行通信,传递的消息使用的是不可变消息,Actor之间其实共享数据社会形态,可能有数据共享则通过消息发送的土法子进行;(2) 各Actor都是对应的mailbox,可能其它Actor向该Actor发送消息,消息将入队待后期处理;(3)Actor间的消息传递通过异步的土法子进行,即消息的发送者发送完消息后其实等待英文宣告便可不都要返回继承处理其它任务。