【AKKA 官方文檔翻譯】akka庫和模塊概覽

akka庫和模塊概覽

akka版本2.5.8
版權聲明:本文爲博主原創文章,未經博主允許不得轉載。

在深入研究編寫actor的一些最佳實踐之前,預覽一下akka最常用的庫將會很有幫助。這將會幫助你開始考慮你要在系統中實用的功能。所有akka的核心功能都能以開源軟件(OSS)方式獲取。Lightbend贊助akka的開發,你也可以通過其獲得商業支持,如培訓,諮詢,支持和企業套件-用於管理akka系統的全套工具。

Akka OSS包含以下功能,稍後會在本篇介紹:

1、actor庫
2、遠程處理
3、集羣
4、集羣分片
5、集羣單例
6、集羣發佈-訂閱
7、持久化
8、分佈式數據
9、HTTP

藉助Lightbend訂閱,您可以在生產環境中使用Enterprise Suite。企業套件包括以下Akka核心功能的擴展:

Split Brain Resolver — Detects and recovers from network partitions, eliminating data inconsistencies and possible downtime.

Configuration Checker — Checks for potential configuration issues and logs suggestions.

Diagnostics Recorder — Captures configuration and system information in a format that makes it easy to troubleshoot issues during development and production.

Thread Starvation Detector — Monitors an Akka system dispatcher and logs warnings if it becomes unresponsive.

本文並未列出所有akka的可用模塊,但概述了主要功能,並讓你瞭解在Akka之上構建系統時可以達到的複雜程度。

Actor庫

Akka的核心庫是akka-actor。但是actor被用在整個akka庫中,提供了一個一致的、集成的模型,它可以幫你解決一些在構建併發或者分佈式系統時遇到的挑戰。從整體來看,actor是一種具有封裝的編程模式(封裝是OOP的核心),actor把封裝發揮到了極致。與對象不同,actor不僅封裝了內部狀態,而且封裝了執行過程。與actor進行交流不是通過方法調用,而是通過消息傳遞。這些區別可能看起來很小,但是它真正解決了我們在併發和遠程通信時使用OOP編程遇到的限制。不要被這個描述嚇到了,下一章我們將詳細介紹actor。現在,重要的一點是,actor是一個可以合理地處理併發和分佈式的方法,而不是特別爲OOP編程打的一個補丁。

Actor解決了以下挑戰:

1、如何構建和設計高性能的併發應用
2、如何處理多線程環境中的錯誤
3、如何防止併發的缺陷

遠程處理(Remoting)

Remoting允許actor分佈在不同的計算機上,並且能和單機一樣互相傳遞消息。使用jar文件進行分佈式分發時,Remoting更像一個模塊而不是一個庫。你可以主要通過配置來啓動它,並且它只有幾個API。多虧了actor模型,使我們在發送遠程消息時的操作和本地消息傳遞是完全一致的。你在本地系統上使用的模式可以直接用在遠程系統上。你很少會直接使用Remoting,但它爲構建集羣子系統提供了基礎。

Remoting解決了以下挑戰:

1、如何聯繫在遠程主機上的actor系統
2、如何聯繫遠程actor系統上的一個actor
3、如何把消息轉換成線路上的字節
4、如何管理低級別的主機間的網絡連接(重連接)、檢測actor系統和主機的崩潰,這些對操作者都是透明的
5、如何多路複用來自同一網絡連接上不同的actor通信

集羣(Cluster)

如果你有一套協作的actor系統來幫你解決一些業務問題,那麼你應該會想要用一種嚴謹的方式來管理它們。Remoting幫你解決了與遠程系統的連接、通信的問題,而Clustering會爲你提供能力,讓你通過成員協議把這些系統組織在一起。在大多是情況下,你希望使用Cluster模塊而不是直接使用Remoting。Clustering在Remoting之上,提供了額外的一些服務,這些服務是現實應用程序所需要的。

Cluster模塊解決了以下挑戰:

1、如何維護一組可以互相通信的actor系統(一個集羣),並將其視爲集羣的一部分
2、如何安全地向一組存在的系統里加入一個新的actor系統
3、如何可靠地檢測到一個系統暫時無法被訪問
4、如何刪除失敗的主機/系統(或縮小(scale down)系統),讓集羣剩餘的成員仍然可以互相協作
5、如何在當前成員間分配計算工作
6、如何給一個成員指定一個角色。換句話說,這個成員要執行A服務而不是B服務。

集羣分片(Cluster Sharding)

Sharding幫助我們解決在akka集羣中如何把一組actor分配下去的問題。Sharding是一種模式,它經常會與Persistence配合使用,來平衡將要發送給集羣成員的大量持久化元素(由actor支持的),並當集羣成員崩潰或離開時轉移到其他節點。

Sharding解決了以下挑戰:

1、如何在一組系統上建模和擴展一大組狀態實體
2、如何確保集羣中的實體正確分佈,以使各個機器間保持負載均衡
3、如何確保從崩潰的系統中遷移實體而不會丟失狀態
4、如何確保一個實體同時不會同時在多個系統上存在,從而保持一致性

集羣單例(Cluster Singleton)

在分佈式系統中常見的(實際上非常常見)做法是把一個實體分配給一個任務,這個任務爲集羣中的其他成員所共享,當主機系統出現故障時將其遷移。不可否認這給整個集羣的擴展帶來了共同的瓶頸,但是在使用這個模式時,這些場景是不可避免的。Cluster singleton允許集羣去選擇一個actor系統來部署一個特別的actor,這樣集羣中其他的系統就總是能在其系統內獨立地訪問這個部署的actor。

Singleton模塊解決了以下挑戰:

1、如何確保整個集羣中只有一個服務實例正在運行
2、當系統主機崩潰、或在縮小集羣(scaling down)時被停機,如何確保服務的可用
3、假設這個服務可以隨時遷移到其他系統,如何保證集羣中的任何成員都可以訪問該實例

集羣發佈-訂閱

爲了協調系統內成員,經常會需要分發消息給所有成員,或者集羣內一組感興趣的成員。這種模式通常被稱爲發佈-訂閱模式,本模塊解決了這個特定問題。本模塊支持將一個主題的消息廣播給所有訂閱者,或者將消息發送給任意感興趣的actor。

集羣發佈 - 訂閱旨在解決以下挑戰:

如何將消息廣播給羣集中感興趣的一組actor。
如何將消息發送給羣集中感興趣的一組成員。
如何訂閱和取消訂閱集羣中某個主題的事件。

持久化

就像OOP裏的對象一樣,actor在內存中保持着它們的狀態。一旦系統因爲正常停止或者崩潰而導致停機,所有在內存中的數據都將丟失。持久化模塊提供了可以讓actor對其內部狀態事件進行持久化的模式,在啓動之後,這些事件可以被重現並且恢復actor的內部狀態。這個事件流可以被查詢並且被放入其他的處理管道(例如外部大數據集羣)裏或備用視圖(如報告)裏。

持久化模塊旨在解決以下挑戰:

1、如何在系統重啓或崩潰時恢復實體/actor的狀態
2、如何實現一個CQRS系統
3、在面對網絡錯誤和系統崩潰時,如何確保消息分發可靠
4、如何產生領域事件,以便使用它恢復當前狀態
5、在項目不斷髮展的過程中,如何在我的應用程序中使用事件驅動機制來支撐長時間運行的進程

分佈式數據

在接受最終一致性的系統裏,可以在akka集羣中的節點之間共享數據,即使在集羣分片的情況下也可以允許讀寫操作。這可以通過使用Conflict Free Replicated Data Types (CRDTs)來實現,可以並行地在不同節點進行寫入,並在之後以可預測的方式合併。分佈式數據模塊提供了共享數據的方式,也提供了一下有用的數據類型。

分佈式數據模塊旨在解決以下挑戰:

1、在集羣分片的情況下如何寫入數據
2、如何共享數據,同時確保低延遲的本地讀寫訪問

Actor是併發的一個基本模型,但是有些公共的模式,需要使用者在使用的時候一次又一次地去實現它們。一種非常常見的場景,actor的鏈或圖可能需要處理巨大的或無限的流序列事件,並且合理地協調資源使用,以便在處理時,較快的處理階段不會使鏈或圖中的較慢的處理階段不堪重負。流模塊提供了一個在actor模型之上的更高層抽象,簡化了一些代碼編寫(如處理網絡、處理所有後臺細節)並提供了安全、類型化的可組合編程模型。流模塊也是Reactive Streams標準的一個實現,允許和所有其他第三方實現集成在一起。

流模塊解決了以下挑戰:

1、如何高性能地處理事件流或大型數據集,充分利用併發行並保持資源利用率
2、如何將可重複使用的事件/數據處理組合成靈活的管道
3、如何以一種靈活的方式將異步服務連接在一起,並且擁有良好的性能
4、如何提供與Reactive Streams兼容的接口,如何使用實現了Reactive Streams的第三方庫的接口

HTTP

HTTP是提供內部或外部遠程API的事實標準,akka提供了一些創建HTTP服務的工具(並服務於它們),也提供了一個可使用其他服務的客戶端,讓我們可以構建或使用這些HTTP服務,這些工具特別適合於,利用Akka Stream模塊裏的基礎模塊來流入流出大量數據,和實時事件。

HTTP模塊處理的一些挑戰:

1、如何以高性能的方式通過HTTP API將系統或集羣的服務公開給外部世界
2、如何使用HTTP將大數據集流入和流入系統
3、如何使用HTTP將系統中的實時事件流入和流出系統

模塊使用實例

Akka中各個模塊無縫整合在一起。例如,考慮網站用戶訪問的一大組有狀態的業務對象,如文檔或購物車。如果使用Sharding和Persistence對這些分片進行建模,則它們將在可以按需擴展的集羣中進行平衡。即使因爲一些因素產生的高峯流量下,它們也可以順利地運行,甚至當某些系統崩潰時仍可提供服務。您還可以使用Persistence Query輕鬆獲取實時的域事件流,並使用Streams將其導入流式快速數據引擎。之後,將該引擎的輸出視爲Stream,使用Akka Streams操作符對其進行操作,並將其暴露爲由集羣託管的負載均衡HTTP服務器集合提供的Web套接字連接,以便爲您的實時業務分析工具提供支持。

我們希望這個概覽引起了你的興趣!下一個主題將介紹一些示例應用程序。

發佈了20 篇原創文章 · 獲贊 74 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章