Scala 并发编程模型Akka(一) Akka简介
- Akka是JVM平台上构建高并发、分布式和容错应用的工具包和运行时,也可以理解成是编写并发程序的框架。
- Akka用Scala语言写成,同时提供了Scala和JAVA的开发接口。
- Akka主要解决的问题是:可以轻松的写出高效稳定的并发程序,程序员不再过多的考虑线程、锁和资源竞争等细节。
Actor 模型用于解决什么问题
- 处理并发问题关键是要保证共享数据的一致性和正确性,因为程序是多线程时,多个线程对同一个数据进行修改,若不加同步条件,势必会造成数据污染。但是当我们对关键代码加入同步条件synchronized 后,实际上大并发就会阻塞在这段代码,对程序效率有很大影响。
- 若是用单线程处理,不会有数据一致性的问题,但是系统的性能又不能保证。
- Actor 模型的出现解决了这个问题,简化并发编程,提升程序性能。 你可以这里理解:Actor 模型是一种处理并发问题的解决方案,很牛!
Akka 中 Actor 模型
Actor模型及其说明
- Akka 处理并发的方法基于 Actor 模型。(示意图)
- 在基于 Actor 的系统里,所有的事物都是 Actor,就好像在面向对象设计里面所有的事物都是对象一样。
- Actor 模型是作为一个并发模型设计和架构的。Actor 与 Actor 之间只能通过消息通信,如图的信封
- Actor 与 Actor 之间只能用消息进行通信,当一个 Actor 给另外一个 Actor发消息,消息是有顺序的(消息队列),只需要将消息投寄的相应的邮箱即可。
- 怎么处理消息是由接收消息的Actor决定的,发送消息Actor可以等待回复,也可以异步处理
- ActorSystem 的职责是负责创建并管理其创建的 Actor, ActorSystem 是单例的(可以ActorSystem是一个工厂,专门创建Actor),一个 JVM 进程中有一个即可,而 Acotr 是可以有多个的。
- Actor模型是对并发模型进行了更高的抽象。
- Actor模型是异步、非阻塞、高性能的事件驱动编程模型。[案例: 说明 什么是异步、非阻塞, 最经典的案例就是ajax异步请求处理 ]
- Actor模型是轻量级事件处理(1GB 内存可容纳百万级别个 Actor),因此处理大并发性能高.
Actor模型工作机制说明
Actor模型的工作机制(对应上图)
- ActorySystem创建Actor
- ActorRef:可以理解成是Actor的代理或者引用。消息是通过ActorRef来发送,而不能通过Actor 发送消息,通过哪个ActorRef 发消息,就表示把该消息发给哪个Actor
- 消息发送到Dispatcher Message (消息分发器),它得到消息后,会将消息进行分发到对应的MailBox。(注: Dispatcher Message 可以理解成是一个线程池, MailBox 可以理解成是消息队列,可以缓冲多个消息,遵守FIFO)
- Actor 可以通过 receive方法来获取消息,然后进行处理。
Actor模型的消息机制(对应上图)
- 每一个消息就是一个Message对象。Message 继承了Runable, 因为Message就是线程类。
- 从Actor模型工作机制看上去很麻烦,但是程序员编程时只需要编写Actor就可以了,其它的交给Actor模型完成即可。
- A Actor要给B Actor 发送消息,那么A Actor 要先拿到(也称为持有) B Actor 的 代理对象ActorRef 才能发送消息