1. 程式人生 > >Akka(0):聊聊對Akka的初步瞭解和想法

Akka(0):聊聊對Akka的初步瞭解和想法

   前一段時間一直沉浸在函數語言程式設計模式裡,主要目的之一是掌握一套安全可靠的併發程式程式設計方法(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吧。。。