Actor model的理解
-
actor 是并发计算中的一个基本原语,actor 接收消息并对收到的消息做出响应。
下面说说我个人对 actor 的理解吧,不一定对,有不对的地方欢迎指正!
为什么 Actor model 可以解决并发问题?
首先想想并发问题是如何产生的,对同一个数据进行同时写(或者同时读写)会产生并发问题。所以主需要破坏“同时”这个条件,并发问题就迎刃而解了。
常用的互斥锁就是这是这种思路,它保证同一时刻只有一个线程可以访问到数据,在锁的保护下,多个线程对数据的访问变成有序的了。
senders 给 actor 发送消息时,actor 将消息放在了它的邮箱 (Mail) 中,并从邮箱中一条条取出消息来处理。同一时刻,不会有两条消息被处理,这次消息的处理顺序是有序的,因此自然不会有并发问题。
Actor model 与 CSP:这两者的概念极为相似,都符合生产者消费者模型。
在 CSP 里面,Producer 往 channel 里投递消息,comsumer 从 channel 里取出消息来处理。
在 Actor model 中,sender 往 actor 的 mail 里投递信息,actor 从 mail 里取出消息来处理。
但是两者的关注点不同,CSP 里面生产者关注的是消息队列本身,生产者只负责往消息队列里面投递消息,至于这些消息被谁消费,甚至至可能被多个消费者一起消费,但是它不 care。
但是 Actor model 中,生产者关注的是特定的消费者,生产者往特定的消费者投递消息,消息只能被之前所指定的消费者消费。
任何事物都是有两面性的,message queue 的缺点也十分的明显:利用 message queue 可以有效的解决并发问题,但是它也有一个很明显的缺点,那就是调用方没法及时得到处理的结果。
举个具体的例子:客户端发起一个请求,后端收到请求后,生成了一个对应的消息并放到了消息队列上,有一个消费者不停地从消息队列中取出消息并进行有序消费。但是消息者处理完消息后是无法将处理的结果告诉生产者的。
这个问题一般有两种解决方法:第一:可以生产者不停对消费者进行轮询,询问消息的结果。第二种方法是消费者消费完消息后,通知生产者。但是这两种方式都会增加系统的复杂度。
由于 Actor model 在我看来也是基于消费队列的,所以我很好奇它是如何做到将消息的处理结果实时地告诉 senders 的。
西南地区IT社群(QQ)
- 云南
- 【昆明网页设计交流吧】243627302
- 【昆明nodejs交流吧】 243626749
- 【VUE】838405306
- 【云南程序员总群】343606807
- 【昆明UI设计】104031254
- 【云南软件外包】15547313
- 贵州
- 【PHP/java源码/站长交流群】55692114
- 四川
- 【成都Java/JavaWeb交流】86669225
- 【vaScript+PHP+MySql】116270060
- 【UI设计/设计交流学习群】135794928
- 重庆
- 【诺基亚 JAVA游戏博物馆】 559479780
- 【PHP,Java,Python,C++接单】 442103442
- 西藏