天天看點

actor 模型原理 (一)

actor模型很牛逼,很流行,但是我不會,媽的,國内搜出來的講解actor的都看不太懂,講不太清,下面哥們就翻譯一下老外的文章,以粗淺的方式體會一下到底什麼是actor模型?

多線程開發要處理并發,鎖,線程同步等一系列問題,一不小心,弄個大的bug,是以一般都不願意自己動手寫,能不能換一種思路,可以不可以介紹一種更進階的抽象模型,讓我想實作多線程應用的時候,不用再考慮這些底層問題呢?

actor模型可以一定層度上幫你做到這一點。

從幾個方面來講解一下actor模型必須要解決的幾個問題:

一、消息系統設計,或者叫線程間通信怎麼做?

這裡我們把要通信的線程想象成兩個人,這倆人互相沒法直接說話,都是通過郵件通信交流,假設這倆人一個是老師,一個是學生,他倆通信是通過郵件哈

那麼:

1、學生要跟老師溝通,他就要發個郵件,郵件一旦發出,對不起,不能改任何東西了。你沒有辦法收回改了再發出去,這叫消息一旦發出,就不可改變。

就算你在郵件裡不小心打了一行,我操你媽的,那也沒法改了,郵件已經發出了。

2、老師那邊呢,想什麼時候看郵件,就什麼時候看,這就叫異步,老師并不需要監聽什麼東西

3、老師看了你的郵件,可以給你回複,也可以啥都不幹,但是他郵件一旦發出,同樣不能收回來改——不可變性兩端都一樣的

4、學生也是想啥時候看郵件,就啥時候看,兩邊都是異步,都不會瞪着倆眼啥都不幹,就等郵件過來

那麼這種通信模型,很簡單,但是就是actor模型想要的模型。其實看到這裡,我們可以發現,這種通信方式,其實依賴一套郵件系統,或者叫消息管理系統

程序内部要有一套這樣的系統,給每個線程弄一個獨立的,收發資訊的管道,并且都是異步的,寫了不可更改的這樣的資料系統。

二、并發性,或者叫人多了怎麼辦?

想想現在如果不是一個老師一個學生,而是三個老師三個學生呢 ?

每個學生給每個老師都發郵件,然後老師收到誰的,還都要回,當然這種郵件系統我們現實生活中是基本的功能,沒什麼特殊的呀

那麼注意啊,actor的設計跟我們日常生活有所不同,假如你是個傻逼大學老師,你收到了三個學生三封郵件,那麼你收到郵件肯定有先後順序吧

actor要求你不能按照随意的順序打開這些郵件,必須按照先後順序處理,即按照郵件到你郵箱的先後順序處理這些消息

那麼基于一和二的要求,我們可以使用ConcurrentLinkedQueue來實作這種郵箱系統,當然還有很多實作可以做,也可以自己寫一個。

三、容錯,或者叫某個老師挂了怎麼辦

學生給老師發郵件,老師給學生回複郵件,ok,那麼假如你通過郵件給實體老師問了一個問題,但是教你的實體老師出事了,不幹了,或者跑路了,學校不止一個實體老師啊,

肯定要再安排一個實體老師把原來那個老師的職責擔起來,那麼這個郵件怎麼辦?新來的老師可能會選擇忽略這些他上任之前的任何郵件,關于容錯後面會再繼續讨論

學校就像一個pool, actor pool ,來模拟各種類型的老師,一個挂了,馬上建立一個新的,幹同樣事情的actor.

四、多種task模型 ,或者叫一個郵件裡發出多種類型的消息

比如學生發郵件問老師,什麼時候放假,在郵件裡他當然也可以問我期末考試成績出來了嗎,多少分

actor兩邊都可以輕松支援多種類型的task

五、請求鍊 ,或者我想讓三個老師一塊給我做件事呢,而不是一個個挨個請求

這個後面再講。

繼續閱讀