閱讀143 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《七周七並發模型》第五章Actor總結

5.5 複習

Smalltalk的設計者、麵向對象編程之父Alan Kay曾經這樣描述麵向對象的本質①:很久以前,我在描述“麵向對象編程”時使用了“對象”這個概念。很抱歉這個概念讓許多人誤入歧途,他們將學習的重心放在了“對象”這個次要的方麵。
真正主要的方麵是“消息”……日文中有一個詞ma,表示“間隔”,與其最為相近的英文或許是“ interstitial”。創建一個規模宏大且可生長的係統的關鍵在於其模塊之間應該如何交流,而不在於其內部的屬性和行為應該如何表現。這段話也概括了使用actor模型進行編程的精髓——我們可以認為actor模型是麵向對象模型在並發編程領域的擴展。 actor模型精心設計了消息傳輸和封裝的機製,強調了麵向對象的精髓,可以說actor模型非常“麵向對象”。

優點

actor有許多優良的特性,適用於解決多種並發問題。消息傳輸和封裝雖然多個actor可以同時運行,但它們並不共享狀態,而且在單個actor中所有事件都是串行執行的。所以關於並發,隻需要關注於多個actor之間的消息流即可。

對開發人員來說這是個重大利好。每個actor可以被單獨測試,而且當測試覆蓋了某個actor的消息類型和消息順序時,就可以確定這個actor非常可靠。如果發現了一個與並發相關的bug,也就知道重點應該放在actor之間的消息流上。

容錯
使用actor模型的程序天生具有容錯性。這不僅會讓程序更加強壯,而且(通過“任其崩潰”的哲學)會讓代碼更加簡潔明了。

分布式編程

actor模型支持共享內存模型,也支持分布式內存模型,這就帶來了很多優點。首先, actor模型幾乎可以解決任何規模的問題。我們不需要將問題局限於用一個係統解決。其次, actor模型可以解決地理分布式問題。對於不同部分需要部署在不同地理位置的軟件,Actor模型是個極佳的選擇。最後,分布式是軟件具有容錯能力的基石。

缺點

盡管使用actor模型的程序比使用線程與鎖模型的程序更容易debug,但actor模型仍會碰到死鎖這一類的共性問題,也會碰到一些actor模型獨有的問題(例如信箱溢出)。

類似於線程與鎖模型, actor模型對並行也沒有提供直接支持。需要通過並發的技術來構造並行的方案,這樣就會引入不確定性。而且,由於多個actor並不共享狀態,僅通過消息傳遞來進行交流,所以不太適合實施細粒度的並行。

其他語言

與許多偉大的思想一樣, actor模型也由來悠久——20世紀70年代Carl Hewitt首次提出這個模型。 Erlang無疑為布道actor做了最大的貢獻。比如Erlang的創始人Joe Armstrong也是“任其崩潰”哲學的先驅。大部分流行的編程語言都提供了一個actor庫,特別是Akka庫①為Java和其他運行於JVM的語言提供了對actor模型的支持。如果想深入學習Akka,建議閱讀本書的獎勵章節②,其中描述了如何用Scala進行actor編程。
——————————
① https://akka.io
② https://media.pragprog.com/titles/pb7con/Bonus_Chapter.pdf (此文有興趣翻譯的可以聯係並發編程網

結語

actor模型是應用最廣泛的編程模型之一——不僅提供了並發支持,還支持分布式、錯誤檢測和容錯。當麵對越來越大的分布式需求時,該模型是解決問題的絕佳選擇。

下一章我們將學習通信順序進程( Communicating Sequential Processes, CSP)。雖然CSP模型看上去類似於actor模型,但區別在於: actor模型的重點在於參與交流的實體,而CSP模型的重點在於用於交流的通道。因此使用CSP模型將是另一番體驗。

最後更新:2017-05-23 09:31:36

  上一篇:go  《七周七並發模型》第五章Actor引言
  下一篇:go  競態條件與臨界區