Akka適用於分佈式系統《five》譯

    正如上一篇所描述的那樣,通用編程實踐並不能恰當地知足要求現代系統的需求。謝天謝地,咱們不須要把咱們所知道的所有都廢棄了。相反,角色模型以必定原則方式解決這些缺點,讓系統可以以更好的方式與咱們的心智模式相匹配。角色模型抽象容許您從通訊方面考慮您的代碼,而不是像大型組織中的人之間發生的交換。html

    角色模型容許咱們:編程

  • 強制封裝而無需使用鎖
  • 使用協做實體的模型對信號作出反應,改變狀態,並相互發送信號以推進整個應用程序向前發展
  • 不要擔憂與咱們的觀念不匹配的執行機制。

消息傳遞的使用避免鎖定和阻塞

    Actor不是調用方法,而是互相發送消息。發送消息不會將執行線程從發送方傳輸到目標,Actor能夠發送消息並繼續而不會阻止。所以,它能夠在相同的時間內完成更多。緩存

    對於對象,當方法返回時,它釋放對其執行線程的控制。在這方面,actor的行爲與對象很是類似,它們在完成處理當前消息時對消息做出反應並返回執行。經過這種方式,Actor實際上實現了咱們想象的對象的執行:網絡

    傳遞消息和調用方法之間的一個重要區別是消息沒有返回值。經過發送消息,Actor將工做委託給另外一個Actor。正如咱們在回調的錯覺中看到的那樣,若是它指望返回值,則發送方須要阻止或在同一線程上執行其餘Actor的工做。相反,接收者將結果傳遞給回覆消息。ide

    咱們模型中須要的第二個關鍵變化是恢復封裝(reinstate encapsulation)。Actor對消息做出反應,就像對象「響應」它們上調用的方法同樣。不一樣之處在於,不是多個線程「響應」到咱們的Actor中而且對內部狀態和不變量形成嚴重破壞,Actor獨立於消息的發送者執行,而且他們一次一個地順序響應傳入的消息。當每一個Actor按順序處理髮送給它的消息時,不一樣的Actor會相互同時工做,這樣Actor系統就能夠同時處理硬件支持的消息。ui

    因爲每一個actor最多隻能處理一條消息,所以能夠保持actor的不變量而不synchronization。這種在不使用鎖的狀況下使用:spa

    總之,這是Actor收到消息時發生的事情:操作系統

  • Actor將消息添加到隊列的末尾。
  • 若是Actor未安排執行,則將其標記爲準備執行。
  • 調度程序接受Actor並開始執行它。
  • Actor從隊列前面挑選消息。
  • Actor修改內部狀態,將消息發送給其餘Actor。
  • Actor是不按期的。

    爲了實現這種行爲,Actor有:線程

  • 郵箱(郵件結束的隊列)
  • 行爲(Actor的狀態,內部變量等)
  • 消息(表示信號的數據片斷,相似於方法調用及其參數)
  • 執行環境(須要具備消息響應並調用其消息處理代碼的actor的機制)
  • 地址(稍後會詳細介紹)

    消息進入Actor郵箱。該角色的行爲描述了角色如何響應消息(好比發送更多消息和/或更改狀態)。執行環境將線程池從新設置爲徹底透明地驅動全部這些操做。htm

    這是一個很是簡單的模型,它解決了之前列舉的問題:

  • 經過將執行與信號解耦來保留封裝(方法調用傳輸執行會,消息傳遞不會)。
  • 不須要鎖。修改actor的內部狀態只能經過消息進行,消息一次處理一次,在嘗試保持不變量時消除競爭。
  • 在任何地方都沒有使用鎖,而且不會阻止發件人。能夠在十幾個線程上有效地安排數百萬演員,充分發揮現代CPU的潛力。任務受權是演員的天然操做模式。
  • 參與者的狀態是本地的而不是共享的,更改和數據經過消息傳播,這些消息映射到現代內存層次結構實際工做的方式。在許多狀況下,這意味着只傳輸包含消息中數據的緩存行,同時保持本地狀態和數據緩存在原始核心。相同的模型徹底映射到遠程通訊,其中狀態保存在機器的RAM中,而且變化/數據做爲分組在網絡上傳播。

Actor優雅地處理錯誤狀況

    因爲咱們再也不在發送消息的Actor之間擁有共享調用堆棧,所以咱們須要以不一樣方式處理錯誤狀況。咱們須要考慮兩種錯誤:    

  • 第一種狀況是,因爲任務中的錯誤(一般是某個驗證問題,如不存在的用戶ID),目標參與者上的委託任務失敗。在這種狀況下,由目標參與者封裝的服務是完整的,只有任務自己是錯誤的。服務參與者應該給發件人回覆一條消息,並給出錯誤狀況。這裏沒有什麼特別的地方,錯誤是域的一部分,所以成爲普通消息。
  • 第二種狀況是服務自己遇到內部故障。Akka強調全部的演員都被組織成一個樹狀的層次結構,也就是說,一個創造另外一個演員的演員變成了那個新演員的父親。這很是相似於操做系統如何將進程組織到樹中。就像進程同樣,當參與者失敗時,它的父參與者會獲得通知,它能夠對失敗作出反應。此外,若是父角色被中止,那麼它的全部子元素也會被遞歸地中止。這項服務被稱爲監督。

    主管(父母)能夠決定在某些類型的故障中從新啓動其子actor,或者徹底阻止其餘人。孩子們永遠不會沉默地死去(除了進入無限循環以外),他們要麼失敗,要麼他們的父母能夠對錯誤做出反應,或者他們被中止(在這種狀況下,有關方會自動獲得通知)。老是有一個負責任的實體來管理一個演員:它的父母。從外部看不到從新啓動:協做actor能夠在目標actor從新啓動時繼續發送消息。

    下一章,讓咱們簡要介紹一下Akka提供的功能。

 

原文:https://doc.akka.io/docs/akka/current/guide/actors-intro.html

有什麼討論的內容,能夠加我公衆號:

相關文章
相關標籤/搜索