2014年6月6日 星期五

[程式]AKKA ,Scala的分散式系統API 心得筆記

前言

太久沒接觸程式,現在熊熊開始想要學,才發現這個世界的科技變了很多,很多大學沒看過的語言,概念都跑了出來 哈哈。最近因為找工作的關係,開始有想要增強coding能力的念頭,所以最近都忙著讀網站上的文件,以及參與相關的聚會,還以這個當藉口買了一台Macbook Air!這次參與的是禮拜四高雄軟體開發者社群(KSDG)舉辦的 Akka 介紹,這是我第一次參加這個社群的活動,地點在高雄軟體園區,雖然我有點怕生沒有認識什麼人,不過聽別人教學,的確是省了許多自己摸索的時間,真是非常感謝熱心的分享者。  


何時該用Akka

Akka 是一個分散式系統的API,可以用JAVA或是SCALA呼叫。使用的場景大家可以想像,如果自己公司要架分散式系統,Deploy、Sever之間的溝通是件很麻煩的事,原本單純用JAVA要花很多行code處理Error,如何溝通,如何分派工作等等,在Akka之中,有對應的API包裝這件事,對於要架分散式系統這件事,Akka著實的可以省了不少麻煩。

Akka的歷史

Philipp Haller在2006年推出Actor Model的實作,作為Scala的一部分。 2008年時 Scala 因為處理複雜伺服器應用程式的優勢得到注目,接著Erlang等event driven的平行(concurrent)程式語言開始流行,Jonas Bonér,Scala的發明者於是就想加進這個特色,然後就有Akka的誕生。

Actor  Model

Akka的核心概念,就是Actor Model。簡單來說,就是同時發生的process,透過訊息交換達成process的溝通。跟物件導向程式中的 物件(Object)有點像,只是Actor具有平行處理的屬性,而物件沒有罷了。

Wikipedia上的定義是
1.Actor可以傳送有限數量的訊息給其他Actors
2.可以創造出有限數量的Actor
3.可以設計Actor如果接收到不同的訊息,進行不同的行動。

為了讓大家容易了解,大家可以想像在古老的莊園,一個貴族的住宅裡,每天都有很多的事情要請管家分配給僕人做,今天,管家要先把僕人叫過來告訴他們,他們該做甚麼事。僕人A要除草,僕人B要煮飯,僕人C要整理房間等等,僕人做完的時候要回報給管家。

現在回到Akka,假設我是莊園的貴族(root),我可以創造出任意數量的人(Actor)。我先創造出管家(Actor Master),管家也可以創造出任意數量的僕人(Actor Slave)。 管家可以給僕人不同的指令,僕人接受到不同的指令會做不同的工作,而僕人做完要回報給管家知道。當然,Akka是分散式系統的語言,不同的Actor可以存在不同的機器中,進而達到分散式系統的實際運作,而這種架構Scalability想必會很好。

The Life Cycle of Akka

Actor在開始,結束,意外結束前,意外結束後,大家可以設計在這四個狀況Actor要做的行為。

1.preStart 
(Actor創立時最先做的事,像constructor of C/C++)

2.preRestart
(如果Error導致Actor死掉時,死掉之前要做的事)

3.postRestart
(因為Error導致Actor死掉時,Restart後的新Actor最先要做的事)

4.postStop
(結束前要做的事)

簡單API介紹

在這邊介紹一些基礎的功能

1. CreateActors (可以創造子Actor)

2. Command()   (給child Actor指令)

3. context.actoSelection()(尋找特定actor)

4. Future()(parent接收child actor的指令)

5. onConplete()(child 回傳給parent的訊息)

其他功能

1.Scheduler (設定每隔多久要下給Actor指令)

2.Watch  (監視Actor是否關閉or重啟)

3.become - unbecome (可以化身成不同的Actor,多用於Final State Machine)

4.Dispatcher(可以選擇執行actor的thread數量,CPU數目等等)

5.Router(收到不同指令,再派不同工作給其他Actor)