Actor 是一種不考慮實際實作上是Process還是Thread的抽象概念運算單元,擁有下列特性:
從這些抽象字義上看,Actor Model與物件導向程式(OOP)所討論的類別/物件,以及物件之間發送訊息的設計概念上頗相似,但存在差異:
Actor Model的概念,這如果光看上述文字說明,其實還是很難理解,接下來會以一個我們實際生活上可能會碰到的的情境範例來比喻說明。
除夕下午三點半,在遠方的阿公打電話給媽媽說晚上會來吃年夜飯過年並住上兩三天,為了避免長輩看到家裡平日不修邊幅東西亂丟的『亂室佳人』景象,我們全家要趕快先把家裡的東西都收拾好,於是媽媽開始發號施令,叫我們三兄弟各自盡快把自己房間東西收拾好,叫老爸趕快把陽台衣服收進來,又叫他趕快把客廳亂放雜誌收一收然後掃地拖地,以便阿公來的時候,家裡的狀況是整潔的。
以上就是一個生活情境比喻的Actor Model運算架構範例,解釋如下:
當然,這個例子只是為了讓大家更容易理解Actor Model的概念,沒有對應到Actor Model一個很重要的特性:
隨著負載數量級的增加,Actor Model的架構能輕鬆地水平擴展(scale-out),也就是說,當客戶端傳送的訊息數量逐步增加時,Actor Model架構也可增加處理訊息的Actor實體,以便在整體系統的『吞吐量(throughput)』上保持穩定的處理速度,避免客戶端數量越多系統就越慢的問題;而由於Actor在發送訊息的方法在概念上不分本地端/遠端都是一樣的,所以Actor Model架構能在多台機器上部署Actor實體而不需要修改撰寫的程式碼,並且在整體系統的『可用性(availability)』上,避免系統因為某台獨特的關鍵伺服器故障而造成整體系統不可用。
以上是Actor Model的說明,如果想要看Actor Model發明者對於Actor Model的實質討論,可以看這篇The actor model in 10 minutes的Q&A影片。
以及這篇Down and Dirty: Understanding the Actor Model的範例解說。
Virtual Actor Model一句話來說,就是 不用管理Actor實體生命週期的Actor Model :只要有目標Actor實體的識別子(Identifier),就能對該Actor實體發送訊息叫它工作,不需控管子Actor實體的實際生命週期,這些瑣碎事務由實作框架的內部運作機制就幫開發者處理掉,減少開發時的思考負擔。
(有種程式語言發明了Garbage Collection機制後就不必再去思考記憶體管理的感覺)
Orleans框架提供的API基本單元,對應到Virtual Actor Model的,有以下幾個:
也就是Actor Model的Actor。
容納Grain的容器,一個Silo可以容納多個Grain,一個Grain只能屬於一個Silo,有點類似K8s中Pod對應於container的關係。
實際跑Grain運算的實體/虛擬機,在Orleans的API中通常以 SiloHost
來稱呼,但由於現在容器化部署方式流行之後,幾乎都是一個Silo就一個SiloHost對應的架構來部署,所以後來Orleans的運營(ops)相關API也都將對SiloHost為配置標的之部分逐步刪減,改成直接對 Silo
物件為配置標的。
也就是Actor Model中的訊息起始客戶端。
對於Grains的詳細組成結構和物件宣告的實際程式碼寫法,明天繼續介紹(終於要捲起袖子開幹了)。