Akka可能很多人都沒有用過,也不知道是什麼,但如果說起Scala或Spark就有很多人都聽說過或使用過 ,這裡簡單說下三者的關系Akka是使用Scala開發的,Spark中使用了Akka作為其消息的通信工具;這篇文章主要 說說Akka的一些特性,做個簡要的介紹;
要說Akka首先要從并發開始說起,我記得之前我也寫過并發模型相關的文章,并發模型主要有這麼三類:
1、共享記憶體模型
2、Actor模型
3、CSP模型
共享記憶體模型:是通過使用線程與鎖對共享記憶體進行控制用于實作并發,它依賴于多線程、鎖,會産生過多的線程又使用鎖對競态資源進行同步控制,是以性能不是太高,對程式設計也不太友好;
Actor模型:使用Actor作為并發的基礎多個任務之間通過Actor互相發送消息進行通訊,Actor比線程輕量得多,一組Actor使用一個或多個線程是以也就沒有線程、鎖相關影響性能的問題存在,對程式設計也很友好;
CSP模型Communicating Sequential Process):為多個程序提供了channel,并發的任務存放于channel當中,Golang的goroutine也是用了類似CSP模式的并發,并在channel中多加一個緩存;
Actor與CSP模型都提倡:要通過通訊來共享記憶體,不要通過共享記憶體來通訊,這個可以說是他們與共享記憶體模型最大的差別;
介紹了相關的基本概念,接下來說說今天的主題:Akka
簡單來說Akka就是基于Actor模型實作的并發架構;Akka降低了編寫具有容錯性、可擴充的并發程式的難度,容錯性方面采用了“let it crach(讓它崩潰)模型”;Akka為垂直擴充(并發)、水準擴充(遠端調用)、 高容錯提供了一緻的程式設計模型;Akka具有以下幾種特性:
Actors:Actor為并發程式提供了簡單進階别的抽象,為異步、非阻塞、高性能的事件驅動模型,1G記憶體可以容納數百萬個Actor;
容錯性:使用“let it crach”作為其監控層次體系的核心,監控層次可跨越JVM,使編寫出“永不停機”、“自愈和”的高容錯系統的難度大大降低;
位置透明:Akka中所有元素都是為了适應分布式而設計的,Actor之間隻能通過發送消息進行通訊所有操作均是異步進行的,不管是本地Actor還是遠端Actor通信方式、操作都是一緻的;
持久性:Actor的狀态、收到的消息可被持久化,并可在Actor啟動或重新開機時恢複狀态與消息,不管是JVM崩潰或是節點遷移都适用;
下面通過一個Akka程式,然後結束本篇文章;
/**
* Created by linx on 2016-06-26.
*/
class Greeter extends Actor {
override def receive: Receive = {
case "greet" =>
println("hello world")
val hello = context.actorOf(Props[HelloWorld], "hello")
hello ! "done"
}
}
/**
* Created by linx on 2016-06-26.
*/
class HelloWorld extends Actor {
override def receive: Receive = {
case "done" =>
println("done")
context.system.shutdown()
}
}
/**
* Created by linx on 2016-06-26.
*/
object Main {
def main(args: Array[String]): Unit = {
val system = ActorSystem("hello")
val greeter = system.actorOf(Props[Greeter], "greeter")
greeter ! "greet"
}
}
程式先建立一個Greeter Actor然後往該Actor發送“greet”字元串,Greeter Actor收到後列印Hello World,然後建立HelloWorld Actor并發送done,HelloWorld結束整個程式;
程式運作結果:

參考資料:
http://doc.akka.io/docs/akka/2.4.7/scala.html
http://www.solinx.co/archives/464
文章首發位址:Solinx
http://www.solinx.co/archives/612