2018年9月30日 星期日

AKKA.net 心得 (1)


今天從研討會上認識了Akka.net這個框架。它主要是用來做分散式運算的。除了可以在本機上做之外,透過它的套件,就可以跨主機。
由於它都被人家拿來當一個研討會的項目來說明,所以就藉此來認識一下。
以下是進行它的Bootcamp教學時,所記錄的一些心得。
它的BootCamp教學就放在GitHub上,所以透過以下的網址就可以一步步學習。
https://github.com/petabridge/akka-bootcamp

Unit1

1.1

  1. 在Akka的世界裡,最主要的角色是Actor。
  2. Actor用來傳遞訊息
  3. Actor透過Prop來產生
  4. 所有的Actor都屬於ActorSystem
  5. ActorSytem在一個Application只能有一個
  6. 在Akka內很少有用new的,幾乎都是透過工廠方法產生的。
在unit1的練習中,它產生了兩個Actor,一個是ConsoleReader,一個是ConsoleWriter。它先在ConsoleReader的OnReceive方法中,要求要讀取Console,因此當OnReceive方法被呼叫時,其實就會有一個緒卡在讀取Console這裡,直到有人輸入字後才會再往下走。
因此程式一開始,就對ConsoleReader呼叫 Tell("start"),其實這邊打什麼字都無所謂,只是為了要觸發OnReceive方法,開始監控Console的輸入。
而ConsoleReader除了接收輸入外,還要對輸入進行判斷,印到Console上,所以在對ConsoleReader初始化時,還注入了ConsoleWriter,用來將結果印到Console上。
相對ConsoleReader,ConsoleWriter的任務就較簡單,就是將輸入的參數寫到Console上即可。

1.2

在這個單元中,我們將傳輸的訊息重新定義。
定義的方式從原本的字串變成以下兩種

  1. 類別
  2. 常數字串

之前都是直接用字串傳送,接收者將object轉型成字串,判斷字串再做決定。
我們定義了訊息的類別,因此就不再傳字串╡而是傳訊息物件。
在訊息的物件上,我們將訊息先分

  • 成功訊息
  • 失敗訊息
然後再失敗訊息再透過繼承產生特定的錯誤類別。
在判斷時,就直接透過 is 來決定是不是錯誤訊息,再做進一步分類。

1.3

這個單元主要介紹Actor的產生方式,並且透過將Validator邏輯從現有程式的移出來重構程式碼。
Actor產生方式透過Prop這個類別,它有三種產生Actor的方式
  1. Prop.Create(typeof(xxx)) 最不建議使用
  2. Prop.Create<xxx>(); 建議使用,針對沒有建構子的Actor
  3. Prop.Create(()=>new xxx());建議使用,尤其在建構子有輸入參數的時候
建立好之後,我們還要將它設定給ActorSystem,納入管理。給ActorSystem的方式透過
ActorSystem.Actof(xxx,"xxxName");
其中名字可填可不填,但是建議要填寫。因為Debug的時候會很有用處。

1.4

這個單元說明Actor在ActorSystem中的關係。
簡單說,它是一個樹。所以在樹中的結點都是一個Actor。
每一個Actor都被它上層的Actor接管。
所謂接管是指在本Actor出錯時,例外會上拋至上一層Actor。
由上一層Actor來下指示決定要如何處理例外。
上層處理例外時,可以做出以下幾個決定
  1. Restart:重啟子Actor,這是預設的決定
  2. Stop:停止子Actor
  3. Escalate:停止自己,並且讓自己的上一層決定
  4. Resume:無視錯誤,當做沒發生
決定了以上的處理方式時,還可以決定要處理的對像範圍,由以下兩種
  1. One-For-One:只針發出問題的Actor
  2. All-For-One:針對發出問題的Actor及他的所有sibling
要設計這種結構的目的在於將防止錯誤的發散

1.5

這個單元介紹如何以搜尋的方式,取得特定的Actor。以下是注意的事項

  1. 找到的Actor可能不只一個
  2. 找尋的時候,可能與當下的位置有關係 (相對位置而不是絕對位置)
  3. 一般不建議使用,除非是動態行為或是為了在程式發佈後,避免大幅度的修改。
  4. 有些時候,為了要將Actor傳給特定物件,可能會層層傳遞,此時也可以透過搜尋的方式 Decoupling

1.6

Actor的生命週期有以下五種
Starting ->Receiving -> Stopping -> Terminating -> Restarting

  • Starting:被ActorSystem啟用後
  • Receiving:可以開始接收訊息
  • Stopping:資料被清除,可能有兩種原因 Terminating 或是 Restarting
有四個方法會在這些狀態改變時被呼叫,分別是
  1. PreStart:在Receiving前被呼叫,此時適合做Actor的initialize的行為
  2. PreRestart:在Actor被Parent重啟前呼叫,此時可以儲存當下的資料,做為後續錯誤修復時使用
  3. PostStop:在Tememnated及ReStart時會呼叫
  4. PostRestart:在Restart前會進行呼叫,且呼叫後,會接著呼叫PostStop

沒有留言:

張貼留言