Akka可能很多人都沒有用過,也不知道是什麼,但如果說起Scala或Spark就有很多人都聽說過或使用過 ,這裡簡單說下三者的關係Akka是使用Scala開發的,Spark中使用了Akka作為其消息的通信工具;這篇文章主要 說說Akka的一些特性,做個簡要的介紹; 要說Akka首先要從 併發 開始說 ...
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