一 什么是Actor模型复亏?
這里直接引用官網(wǎng)的圖片:
這里面描述了一個Actor包含了:
- Mailbox(郵箱):用于存儲需要actor處理的信息或者數(shù)據(jù)。
- Behavior(行為):描述怎么處理郵箱中的信息芍躏。
- State(狀態(tài)):actor運行時的狀態(tài)
- SupervisorStrategy(管理子actor的策略):用于描述如何管理子actor的策略泌豆,大多用于容錯。
- Children(子actor集合):當前actor所監(jiān)管的子actor西篓。
圖中還有一個ActorRef:
- ActorRef(actor或者actor樹的一個引用):為了使actor和外界隔離或者減輕耦合度,使用一個ActorRef把數(shù)據(jù)或者信息傳遞到actor的郵箱中憋活,使actor對外透明岂津。
總結(jié):
每個actor都有獨立的郵箱,這使得多個actor之間信息或者數(shù)據(jù)相互獨立悦即,這對更利于并行執(zhí)行或者計算吮成。
每個actor之間通信都是通過actorRef完成并把信息放到對應(yīng)actor的郵箱中,郵箱是一個容器辜梳,對于外部來說把信息放入郵箱中是快速的粱甫,至于什么時間處理這個詳細對調(diào)用者來說是透明的。所以說明:
1. actor本身對其他actor是相互獨立的他們的入口不是actor是actorRef作瞄。
2. actor完成任務(wù)是異步的茶宵。每個actor都有自己獨立的狀態(tài)和行為方式。
每個actor都可以成為子actor的管理者或者被父actor管理宗挥。
如果一個功能中有多個actor存在協(xié)作完成任務(wù)乌庶,那他們的結(jié)構(gòu)是一個棵樹形結(jié)構(gòu)。
綜上所述契耿,actor就是一個獨立或者原子瞒大,對外透明,高效并行的處理或者計算任務(wù)的模型宵喂。那和JAVA里面的Thread模型有什么關(guān)系呢?這個話題我會在筆記二中進行說明糠赦,現(xiàn)在只能說actor最終還是跑在線程上的,只是他能更好的利用線程。
二 Actor系統(tǒng)是什么拙泽?
這里還是引用官網(wǎng)的圖片:
上圖中每個圓都表示一個actor淌山,他們組成了一棵樹,分別被父節(jié)點管理著顾瞻,那藍色的actor和灰色的有什么不同呢泼疑?繼續(xù)上圖。
分別說下上圖中的元素,其中不在上圖中出現(xiàn)的Actor屬于同user和system一樣是內(nèi)置Actor不需要手動創(chuàng)建或者配置的:
- "/" 根據(jù)圖中英文的意思應(yīng)該說是守護者什么的(英語是語文老師教的沒辦法)荷荤。那最上面的表示一個特殊的Actor(Root守護者)退渗,他是一個默認并且必須并且特殊的Actor,他是最頂級的管理者,他的管理范圍有:
- /user:是所有用戶創(chuàng)建的Actor的守護Actor; 使用 ActorSystem.actorOf創(chuàng)建的 Actors都屬于他的子Actor蕴纳。
- /system:是所有系統(tǒng)創(chuàng)建的Actor的守護Actor会油,例如在actor系統(tǒng)開始時通過配置自動部署的日志監(jiān)聽器或actor。
- /deadLetters:處理請求掛掉的actor的Actor古毛,所有請求已經(jīng)停止或者不存在的Actor時會將請求重定向到他的郵箱中(盡力而為翻翩,即使在本地JVM內(nèi)也可能丟失消息)。
- /temp:是所有創(chuàng)建出來卻聲明周期很短的Actor的守護者稻薇,例如用于執(zhí)行ActorRef.ask嫂冻,他會生成一個臨時的Actor和對應(yīng)的ActorRef然后發(fā)送信息給其他Actor并返回一個Future只要這個Future處理完成這個臨時的Actor就會關(guān)閉并回收資源。
- /remote:這個Actor管理著所有的遠程Actor塞椎。
- 藍色部分表示是需要開發(fā)者來創(chuàng)建或者配置創(chuàng)建的桨仿。
三 actor在actor系統(tǒng)中路徑的表現(xiàn)方式
繼續(xù)上圖:
這里忽略路徑中的tcp信息,因為和后面一張圖容易混淆案狠,這里就直接理解成在同一個服務(wù)器同一個應(yīng)用中的actor系統(tǒng)關(guān)系服傍。從上圖可以看出最右邊的actor都是通過對于的actor上下文來管理關(guān)系的(重點:上下文中關(guān)系的引用全是對于actor的ActorRef,而不是actor本身骂铁,這也是為了隔離或者獨立actor)伴嗡。在actor對于的ActorRef中可以獲得ActorPath對象,從這個對象的值來看从铲,路徑的表示方法和actor之間的層次結(jié)構(gòu)是一樣的(提示:在actor系統(tǒng)中可以直接根據(jù)路徑來查找ActorRef的,也就找到了對于的Actor)。
遠程Actor表示方式:
上圖是一個由本地和遠程actor組成的actor系統(tǒng)澄暮,這里分為A B兩個服務(wù)器名段,在服務(wù)器A上面創(chuàng)建了一個actor系統(tǒng)并有一個遠程的actor引用也就RemoteActorRef指向真正的child,在B服務(wù)器上也有一個actor系統(tǒng)里面包含一個對A服務(wù)器上parent Actor的一個引用泣懊。這時在服務(wù)器A上獲得child的ActorPath的值是一個邏輯路徑也就是上圖紅色字體表示的路徑伸辟,但是他的物理路徑卻是綠色字體表示的路徑。
從以上可以看出馍刮,不管是單服務(wù)器actor系統(tǒng)還是集群actor系統(tǒng)對于使用者來說是透明的信夫,從而使開發(fā)者專注高效。
此筆記只是個人學(xué)習觀點,筆記粗糙混亂静稻,希望得到更多的指點警没。