在深刻研究編寫Actor的一些最佳實踐以前,先預覽一下最經常使用的Akka庫會頗有幫助。這將幫助您開始考慮要在系統中使用的功能。全部核心Akka功能均可以做爲開源軟件(OSS)使用。Lightbend贊助了Akka開發,但也能夠爲您提供培訓,諮詢,支持和Enterprise Suite 等商業產品,這是一套管理Akka系統的綜合工具。html
Akka OSS包含如下功能,將在本頁後面介紹:編程
使用Lightbend訂閱,您能夠在生產中使用Enterprise Suite ,包括如下對Akka核心功能的擴展:安全
此頁面未列出全部可用模塊,但概述了主要功能,並讓您瞭解在Akka上開始構建系統時能夠達到的複雜程度。服務器
核心Akka庫是akka-actor,在Akka庫中使用了actor,提供了一致的集成模型,使您沒法單獨解決併發或分佈式系統設計中出現的挑戰。Actor是一種編程範式,它將封裝(OOP的支柱之一)帶到極致。與對象不一樣,actor不只封裝了它們的狀態,還封裝了它們的執行。與actor的通訊不是經過方法調用,而是經過傳遞消息。雖然這種差別可能看起來很小,但實際上它容許咱們在併發和遠程通訊方面打破OOP的限制。若是這個描述感受過高而沒法徹底掌握,請不要擔憂,在下一章中咱們將詳細解釋Actor。目前,重要的一點是,這是一個處理基本級別的併發和分發的模型,而不是將這些功能引入OOP的臨時修補嘗試。網絡
Actor解決的挑戰包括:多線程
遠程處理使位於不一樣計算機上的Actor可以無縫地交換消息。雖然做爲JAR包分發,但Remoting比模塊庫更像模塊。您主要使用配置啓用它,它只有幾個API。因爲actor模型,遠程和本地消息發送看起來徹底相同。您在本地系統上使用的模式直接轉換爲遠程系統。您不多須要直接使用Remoting,但它提供了構建Cluster子系統的基礎。併發
遠程解決的挑戰包括如下內容:負載均衡
若是您有一組合做解決某些業務問題的actor系統,那麼您可能但願以一種規範的方式管理這些系統。雖然Remoting解決了與遠程系統組件進行尋址和通訊的問題,但Clustering使您可以將這些組織成一個由成員協議捆綁在一塊兒的「元系統」。在大多數狀況下,您但願使用羣集模塊而不是直接使用遠程處理。羣集在遠程處理之上提供了一組額外的服務,這是大多數實際應用程序所須要的。異步
Cluster模塊解決的挑戰包括如下內容:分佈式
分片有助於解決在Akka集羣成員之間分配一組Actor的問題。Sharding是一種主要與Persistence一塊兒使用的模式,用於平衡大量持久性實體(由actor支持)到集羣成員,並在成員崩潰或離開時將它們遷移到其餘節點。
Sharding解決的挑戰包括:
分佈式系統中常見的(實際上有點常見)用例是讓一個實體負責給定任務,該任務在集羣的其餘成員之間共享,並在主機系統出現故障時進行遷移。雖然這無能否認地引入了限制擴展的整個集羣的共同瓶頸,可是有些狀況下使用這種模式是不可避免的。羣集單例容許羣集選擇將託管特定actor的actor系統,而其餘系統始終能夠獨立於其所在位置訪問所述服務。
Singleton模塊可用於解決這些挑戰:
對於系統之間的協調,一般須要將消息分發到羣集中的一組感興趣系統的全部或一個系統。這種模式一般稱爲發佈 - 訂閱,該模塊解決了這個問題。能夠向主題的全部訂戶廣播消息或者向表示感興趣的任意玩家發送消息。
Cluster Publish-Subscribe旨在解決如下挑戰:
就像OOP中的對象同樣,actor會將它們的狀態保存在易失性內存中。一旦系統關閉,正常或因爲崩潰,內存中的全部數據都將丟失。持久性提供模式以使Actor可以持續致使其當前狀態的事件。啓動時,能夠重播事件以恢復由actor主持的實體的狀態。能夠查詢事件流並將其輸入其餘處理管道(例如,外部大數據集羣)或備用視圖(如報告)。
Persistence應對如下挑戰:
Actor是併發的基本模型,但有一些常見的模式,它們的使用要求用戶反覆實現相同的模式。很是常見的狀況是,Actor的鏈或圖須要處理潛在的大型或無限的順序事件流並正確協調資源使用,以便更快的處理階段不會壓倒鏈或圖中較慢的處理階段。Streams在actor之上提供了更高級別的抽象,簡化了編寫這樣的處理網絡,處理後臺全部精細細節並提供安全,類型化,可組合的編程模型。Streams也是Reactive Streams標準的實現,它能夠與該標準的全部第三方實現集成。
Streams能夠解決如下的問題:
在最終一致性可接受的狀況下,能夠在Akka羣集中的節點之間共享數據,而且即便面對羣集分區也能夠接受讀取和寫入。這可使用無衝突複製數據類型(CRDT)來實現,其中不一樣節點上的寫入能夠同時發生而且以後以可預測的方式合併。分佈式數據模塊提供了共享數據和許多有用數據類型的基礎結構。
Distributed Data旨在解決如下挑戰:
Akka HTTP是Akka的獨立模塊。
遠程,內部或外部提供API的事實標準是HTTP。Akka提供了一個庫,用於構建或使用此類HTTP服務,方法是提供一組工具來建立HTTP服務(並提供服務)和一個可用於使用其餘服務的客戶端。這些工具特別適合經過利用Akka Streams的底層模型來流入和流出大量數據或實時事件。
HTTP模塊解決的一些挑戰:
Akka模塊無縫集成在一塊兒。例如,考慮網站用戶訪問的大量有狀態業務對象,例如文檔或購物車。若是使用分片和持久性將它們建模爲分片實體,它們將在羣集中平衡,您能夠按需擴展。它們將在來自廣告活動的峯值期間或在假期處理以前提供,即便某些系統崩潰也是如此。您還可使用持久性查詢獲取域事件的實時流,並使用Streams將它們傳輸到流式快速數據引擎。而後,將該引擎的輸出做爲Stream,使用Akka Streams運算符對其進行操做,並將其做爲由羣集託管的負載均衡的HTTP服務器集提供的Web套接字鏈接公開,以支持您的實時業務分析工具。
咱們但願此文檔引發您的興趣!下一個主題介紹了咱們將在本指南的教程部分中構建的示例應用程序。
原文:https://doc.akka.io/docs/akka/current/guide/modules.html
有什麼討論的內容,能夠加我公衆號: