从几个方面来讲解一下actor模型必须要解决的几个问题:
一、 消息系统设计,或者叫线程间通信怎么做?
可以把要通信的线程想象成两个人,这两人没法直接说话,都是通过邮件交流。
假设有两个人:勤奋的学生和睿智的老师。学生每天早上都会给老师发送邮件,而聪明的老师都会回复一句名言。这里需要解释:
1、学生发送邮件。一旦发送成功,邮件不能再修改。这天然就具备了不可变性,即使一不小心,发了句老师我喜欢你,那也没法改了;
2、老师会自己决定何时检查邮箱,想什么时候看邮件,就什么时候看,这就叫异步,老师并不需要监听什么东西;
3、老师还会回复一封邮件(也是不可变的),不可变性两端都一样;
4、学生会自己决定何时检查邮箱,也是想啥时候看邮件,就啥时候看,两边都是异步,都不会瞪着俩眼啥都不干,就等邮件过来;
这种通信模型,很简单,但是就是actor模型想要的模型。其实看到这里,我们可以发现,这种通信方式,其实依赖一套邮件系统,或者叫消息管理系统
这就可以总结出Actor模型的一个基本特征——消息传递
二、并发性,或者叫人多了怎么办?
想想现在如果不是一个老师一个学生,而是三个老师三个学生呢?
每个学生给每个老师都发邮件,然后老师收到谁的,还都要回
注意,actor的设计跟我们日常生活有所不同,收到的邮件,肯定有先后顺序
actor要求你不能按照随意的顺序打开这些邮件,必须按照先后顺序处理,即按照邮件到你邮箱的先后顺序处理这些消息
三、容错
actor由谁创建?
actorSystem创建,
actor是多例的,可以有很多的actor同时存在
actorSystem 是单例的,在一个jVM环境中,只要有一个actorsystem就ok了
actorSystem负责创建并管理actor
教学团队,
每一个老师就相当于一个actor,
其他的actor
负责招聘的教学总监来管理
图解:
1. 学生创建一个ActorSystem
2. 通过ActorSystem创建ActorRef,将QuoteRequest消息发送到ActorRef(教师代理)
3. ActorRef(教师代理)消息传递到Dispatcher中
4. Dispatcher依次的将消息发送到TeacherActor的邮箱中
5. Dispatcher将邮箱推送到一条线程中
6. 邮箱取出一条消息并委派给TeacherActor的receive方法