Akka

 

从几个方面来讲解一下actor模型必须要解决的几个问题:

一、 消息系统设计,或者叫线程间通信怎么做?

可以把要通信的线程想象成两个人,这两人没法直接说话,都是通过邮件交流。

假设有两个人:勤奋的学生和睿智的老师。学生每天早上都会给老师发送邮件,而聪明的老师都会回复一句名言。这里需要解释:
  1、学生发送邮件。一旦发送成功,邮件不能再修改。这天然就具备了不可变性,即使一不小心,发了句老师我喜欢你,那也没法改了;
  2、老师会自己决定何时检查邮箱,想什么时候看邮件,就什么时候看,这就叫异步,老师并不需要监听什么东西;
  3、老师还会回复一封邮件(也是不可变的),不可变性两端都一样;
  4、学生会自己决定何时检查邮箱,也是想啥时候看邮件,就啥时候看,两边都是异步,都不会瞪着俩眼啥都不干,就等邮件过来;
 这种通信模型,很简单,但是就是actor模型想要的模型。其实看到这里,我们可以发现,这种通信方式,其实依赖一套邮件系统,或者叫消息管理系统
  这就可以总结出Actor模型的一个基本特征——消息传递

 Akka

 

二、并发性,或者叫人多了怎么办?

 

想想现在如果不是一个老师一个学生,而是三个老师三个学生呢?

每个学生给每个老师都发邮件,然后老师收到谁的,还都要回

注意,actor的设计跟我们日常生活有所不同,收到的邮件,肯定有先后顺序

actor要求你不能按照随意的顺序打开这些邮件,必须按照先后顺序处理,即按照邮件到你邮箱的先后顺序处理这些消息

 

Akka

 

 

三、容错

 Akka

 

 

 

 

actor由谁创建?

actorSystem创建,

actor是多例的,可以有很多的actor同时存在

actorSystem 是单例的,在一个jVM环境中,只要有一个actorsystem就ok了

actorSystem负责创建并管理actor

 

教学团队,

每一个老师就相当于一个actor

其他的actor

负责招聘的教学总监来管理

 

 Akka

 

 

 

图解:

1.     学生创建一个ActorSystem

2.     通过ActorSystem创建ActorRef,将QuoteRequest消息发送到ActorRef(教师代理)

3.     ActorRef(教师代理)消息传递到Dispatcher中

4.     Dispatcher依次的将消息发送到TeacherActor的邮箱中

5.     Dispatcher将邮箱推送到一条线程中

6.     邮箱取出一条消息并委派给TeacherActor的receive方法