前一段時間一直沉浸在函數式編程模式里,主要目的之一是掌握一套安全可靠的並發程序編程方法(concurrent programming),最終通過開源項目FunDA實現了單機多核CPU上程序的並行運算。但是,雖然通過在終端實現並行運算能充分利用多核CPU的計算能力把數據處理運算分布到前台可以大大減輕后台服務器的壓力,提高系統整體效率,對現今大數據普遍盛行的系統計算要求還是遠遠不足的,只有通過硬件平行拓展(scale-out)形成機群並在之上實現分布式運算才能正真符合新環境對軟件程序的要求。那么,下一個階段目標應該是分布式運算了。眾所周知,Akka應該是目前最著名和通用的分布式軟件開發工具了,加上是scala語言的開源項目。由於Akka已經是一個在現實中被大量使用的成熟軟件工具,網上各方面的參考資料比較豐富,感覺應該是一個比較理想的選擇。
花了幾天時間研究了一下Akka官方網站上的資料,先在這里把了解的情況在下面做個小結:
Akka程序是由多個Actor組成的。它的工作原理是把一項大運算分割成許多小任務然后把這些任務托付給多個Actor去運算。Actor不單可以在當前JVM中運行,也可以跨JVM在任何機器上運行,這基本上就是Akka程序實現分布式運算的關鍵了。當然,這也有賴於Akka提供的包括監管、監視各種Actor角色,各式運算管理策略和方式包括容錯機制、內置線程管理、遠程運行管理(remoting)等,以及一套分布式的消息系統來協調、控制整體運算的安全進行。
Actor是Akka系統中的最小運算單元。每個Actor只容許單一線程,這樣來說Actor就是一種更細小單位的線程。Akka的編程模式和其內置的線程管理功能使用戶能比較自然地實現多線程並發編程。Actor的主要功能就是在單一線程里運算維護它的內部狀態,那么它的內部狀態肯定是可變的(mutable state),但因為每個Actor都是獨立的單一線程運算單元,加上運算是消息驅動的(message-driven),只容許線性流程,Actor之間運算結果互不影響,所以從Akka整體上來講Actor又好像是純函數不可變性的(pure immutable)。Actor的內部狀態(internal state)與函數式編程不可變集合(immutable collection)的元素差不多,都是包嵌在一個類型內,即F[A] >>> Actor[A]從類型款式來講很相像,那么我們可否對Actor進行函數組合(functional composition),然后實現函數式編程模式的Akka編程呢?應該是不可能的,因為我們無法對Actor的運算結果進行固定。一是我們無法防止Actor的運算產生副作用,再就是Actor的運算結果是無法預料的,例如它可能把結果發送給任何其它Actor,這樣對同樣的輸入就可以產生不同的結果。我們可以把Actor視作不純函數(impure function),對同樣的輸入可能會產生不同的輸出結果,如此就無法把對Actor的編程歸類為函數式編程了,但Actor編程的確是一種有別於其它編程模式、別具風格的編程模式,而且Akka還有一套領域特定語言DSL,是一種獨立的編程模式,即Actor編程模式了。這是一種需要掌握的嶄新編程模式。
Akka程序具備了以下的優點:
1、Responsive 快速響應
以最快時間對用戶請求進行回復(響應)
2、Resilient 高容錯性
可以通過對Actor的:
復制(replication)、
封閉(containment)、
分離(isolation)、
托管(delegation)來應對解決Actor產生的任何程度的錯誤和異常
3、Elastic 可伸縮性
通過提升計算機配置的垂直擴展(scale-up)、添加網絡中計算機數量的水平擴展(scale-out)等系統拓展能力
實現在任何負載壓力情況下的快速響應
4、Message-driven 消息驅動
- 異步通信(asynchronous communication)
- 松散耦合(loosely coupled)
- 位置透明的Actor定位方式
- 負載均衡(load management)、流程控制(flow control)、back-pressure
上面所述特點之一的消息驅動模式中提供了位置透明的Actor定位方式,可以簡單的通過設定消息接收方地址來實現程序的分布式運算。這點倒是很有趣。
除了普通功能的Actor之外,Akka還提供了幾種具有特殊功能的Actor,包括:路由(routingActer)、有限狀態機(FSMActor)、持久式(persistenceActor)。其中persistenceActor很有吸引力,它可以通過CQRS模式幫助實現新的數據庫操作模式ES(Event-Sourcing)。CQRS模式的基本原理是對數據庫的讀和寫進行分離操作,目的是提高大數據類型網絡應用程序的響應。當然,從另一個方面來講,Event-Sourcing作為一種新的數據庫操作模式,應該能解決任何數據庫應用軟件所普遍面對的數據重演功能缺失,以及數據庫使用壓力等問題。
初步打算下面的主攻方向是基於persistenceActor的ES模式數據庫應用和基於Actor-http的Microservice工具庫。當然,希望通過各種努力最終實現讓那些不精通Akka的朋友們能方便的編寫Actor模式的分布式應用程序。這可能會涉及到對Akka功能的再組合,搭建新的更高層次的抽象框架、提供API等。當然,這些還是需要對Akka進行詳細的研究學習后才能有所定論。
剛好,發現在網上的基於scala的Akka討論示范並不多,那在下面一段時間的討論里我們就開始從頭學習Akka吧。。。
