響應(yīng)式(Reactive)編程其實(shí)我沒有太多的經(jīng)驗(yàn),趁著這段期間的學(xué)習(xí)理解來做些整理,對於Actor Model 的實(shí)現(xiàn)在Scala 語言上已經(jīng)有著很成熟的Akka Framework钾怔,我預(yù)期後續(xù)將以Akka 作為這一系列的主要的範(fàn)式的實(shí)踐。
題外話蒙挑,關(guān)於Actor Model/Reactive的實(shí)作選擇很多宗侦,當(dāng)前有個也很紅的Golang,甚至RxJava也是 ~
原生的Akka framework 是以Scala實(shí)作的忆蚀,但我希望能夠以較為熟悉的語言平臺來進(jìn)行試煉矾利,改用Java進(jìn)行專案配置懊悯,相關(guān)的配置baby steps 參考這裡(github markdown)。
在開始之前梦皮,我先搜集了一下關(guān)於Actor Model 的最佳實(shí)踐:
1. Actor的實(shí)踐炭分,最主要是透過避免資源競爭的情況,而達(dá)成能夠解決高併發(fā)的情境剑肯,在發(fā)送的訊息主體上都要求不該傳送可變的訊息內(nèi)容(其實(shí)捧毛,就像是發(fā)生的事實(shí)不可逆一樣)。
2. 如果一但你傳遞的訊息是可變動的让网,那你勢必要回頭去解決傳統(tǒng)Java在Concurrency 上遇到的那些缺點(diǎn)呀忧,譬如競爭所“資源釋放等等。
3. Actor持有狀態(tài)與行為溃睹,並且不直接的開放讓外部的系統(tǒng)或其他actor 來直接改變它而账,這可確保每一個Actor 的最小影響範(fàn)圍以及他的可監(jiān)控性。
4. 在最上層的Actor應(yīng)該善盡到error handle的責(zé)任因篇,不能讓他底下的子actor 或 delegate出去的task 產(chǎn)生錯誤時直接就就回拋System level去泞辐。
5. 如果有blocking 的呼叫,譬如說是rdbms connection, messaging api?, 建議把這段呼叫封裝到Future的操作上竞滓,在 Akka 的 建議當(dāng)中特別提到Blocking needs Careful Management#blocking problem咐吼。
話不多說了,來看一下實(shí)際的代碼
Akka framework提供了多種的套件管理工具機(jī)制來建構(gòu)應(yīng)用程式商佑,我選擇了以gradle 來建構(gòu)java application锯茄,雖然官方是以Gradle來建構(gòu)Scala專案,但為了避免一次開太多炸彈讓我走不下去茶没,我還是先選熟悉的Java專案肌幽。
範(fàn)例專案放在GitHub?:https://github.com/humank/reactive
Actor的實(shí)踐,可以從繼承一個AbstractActor 開始抓半,他唯一需要你定義實(shí)踐的 就是當(dāng)你收到事件訊息時喂急,你應(yīng)該做哪些事情:把 createReceive()給實(shí)現(xiàn)即可。
在實(shí)現(xiàn)receive message時琅关,預(yù)設(shè)Akka framework是有兩個設(shè)計原則:
你應(yīng)該對你的Actor負(fù)責(zé)煮岁,對於每一個訊息類型都設(shè)計她應(yīng)該有的對應(yīng)的處理做法。
如果有任何的訊息類型不在你的Receive handler裡頭可以被處理的話涣易,那麼Akka framework會把這些unHandled message 視為DeadLetters,統(tǒng)一轉(zhuǎn)交給ActorSystem去(具體實(shí)現(xiàn)還待後續(xù))冶伞。
在撰寫Actor 的時候新症,發(fā)現(xiàn)到Actor除了有AbstractActor之外還有個AbstractLoggingActor !
顧名思義,是提供了一個原生具有l(wèi)ogging 機(jī)制的Actor响禽,一開始很好奇想知道這個loggingActor跟一般的有什麼不同徒爹,參考範(fàn)例如下:
仔細(xì)一看代碼line 27荚醒,有個log() method,一開始以為是打錯把log.info() 打成log().info()隆嗅,但實(shí)際上並非如此界阁,深入追蹤代碼一下:
原來他是以Scala trait提供預(yù)設(shè)的log函式來處理相關(guān)log,這樣你就無需自己在引入常見的Akka LogAdapter logger做記錄胖喳。
下一回泡躯,就來探討一下Actor 的Lifecycle in Akka framework?!