Akka系列(一):Akka簡(jiǎn)介與Actor模型

Akka是一個(gè)構(gòu)建在JVM上沼填,基于Actor模型的的并發(fā)框架酌摇,為構(gòu)建伸縮性強(qiáng),有彈性的響應(yīng)式并發(fā)應(yīng)用提高更好的平臺(tái)姨伟。本文主要是個(gè)人對(duì)Akka的學(xué)習(xí)和應(yīng)用中的一些理解。

Actor模型

Akka的核心就是Actor豆励,所以不得不說Actor夺荒,Actor模型我通俗的舉個(gè)例子,假定現(xiàn)實(shí)中的兩個(gè)人良蒸,他們只知道對(duì)方的地址技扼,他們想要交流,給對(duì)方傳遞信息嫩痰,但是又沒有手機(jī)淮摔,電話,網(wǎng)絡(luò)之類的其他途徑始赎,所以他們之間只能用信件傳遞消息和橙,很像現(xiàn)實(shí)中的的郵政系統(tǒng),你要寄一封信造垛,只需根據(jù)地址把信投寄到相應(yīng)的信箱中魔招,具體它是如何幫你處理送達(dá)的,你就不需要了解了五辽,你也有可能收到收信人的回復(fù)办斑,這相當(dāng)于消息反饋。上述例子中的信件就相當(dāng)于Actor中的消息,Actor與Actor之間只能通過消息通信乡翅。當(dāng)然Actor模型比這要復(fù)雜的多鳞疲,這里主要是簡(jiǎn)潔的闡述一下Actor模型的概念。

Akka中Actors模型

  • 對(duì)并發(fā)模型進(jìn)行了更高的抽象
  • 異步蠕蚜、非阻塞尚洽、高性能的事件驅(qū)動(dòng)編程模型
  • 輕量級(jí)事件處理(1GB內(nèi)存可容納百萬級(jí)別個(gè)Actor)

為什么Actor模型是一種處理并發(fā)問題的解決方案?

一開始我也不怎么理解靶累,腦子里的一貫思維是處理并發(fā)問題就是如何保證共享數(shù)據(jù)的一致性和正確性腺毫,為什么會(huì)有保持共享數(shù)據(jù)正確性這個(gè)問題呢?無非是我們的程序是多線程的挣柬,多個(gè)線程對(duì)同一個(gè)數(shù)據(jù)進(jìn)行修改潮酒,若不加同步條件,勢(shì)必會(huì)造成數(shù)據(jù)污染邪蛔。那么我們是不是可以轉(zhuǎn)換一下思維急黎,用單線程去處理相應(yīng)的請(qǐng)求,但是又有人會(huì)問了侧到,若是用單線程處理叁熔,那系統(tǒng)的性能又如何保證。Actor模型的出現(xiàn)解決了這個(gè)問題床牧。

Actor模型概圖

actor-model.png

從上圖中我們可以看到荣回,Actor與Actor之前只能用消息進(jìn)行通信,當(dāng)某一個(gè)Actor給另外一個(gè)Actor發(fā)消息戈咳,消息是有順序的心软,你只需要將消息投寄的相應(yīng)的郵箱,至于對(duì)方Actor怎么處理你的消息你并不知道著蛙,當(dāng)然你也可等待它的回復(fù)删铃。

JVM中的Actor有以下幾個(gè)特點(diǎn):

  • 每個(gè)Actor都有對(duì)應(yīng)一個(gè)郵箱
  • Actor是串行處理消息的
  • Actor中的消息是不可變的

其實(shí)只從上面一些描述來看,并不能看出Actor在處理并發(fā)問題上的有什么優(yōu)勢(shì)踏堡。

但我總結(jié)了兩點(diǎn):簡(jiǎn)化并發(fā)編程猎唁,提升程序性能

1.簡(jiǎn)化并發(fā)編程:

我們一開始說過并發(fā)導(dǎo)致最大的問題就是對(duì)共享數(shù)據(jù)的操作,我們?cè)诿鎸?duì)并發(fā)問題時(shí)多采用的是
用鎖去保證共享數(shù)據(jù)的一致性顷蟆,但這同樣也會(huì)帶來其他相關(guān)問題诫隅,比如要去考慮鎖的粒度(對(duì)方法,程序塊等)帐偎,鎖的形式(讀鎖逐纬,寫鎖等)等問題,這些問題對(duì)并發(fā)程序來說是至關(guān)重要的削樊,但一個(gè)初寫并發(fā)程序的程序員來說豁生,往往不能掌控的很好兔毒,這無疑給程序員在編程上提高了復(fù)雜性,而且還不容易掌控甸箱,但使用Actor就不導(dǎo)致這些問題育叁,首先Actor的消息特性就覺得了在與Actor通信上不會(huì)有共享數(shù)據(jù)的困擾,另外在Actor內(nèi)部是串行處理消息的芍殖,同樣不會(huì)對(duì)Actor內(nèi)的數(shù)據(jù)造成污染豪嗽,用Actor編寫并發(fā)程序無疑大大降低了編碼的復(fù)雜度。

2.提升程序性能:

我們之前說過既然用單線程處理围小,那如何保證程序的性能昵骤?首先Actor是非常輕量級(jí)的树碱,你可以再程序中創(chuàng)建許多個(gè)Actor肯适,而且Actor是異步的,那么如何利用它的這個(gè)特性呢成榜,我們要做的就是把相應(yīng)的并發(fā)事件盡可能的分割成一個(gè)個(gè)小的事件框舔,讓每個(gè)Actor去處理相應(yīng)的小事件,充分去利用它異步的特點(diǎn),來提升程序的性能赎婚。

其實(shí)Scala中原生的Actor并不能完成很多事刘绣,不是一套完整的并發(fā)解決方案,不適合用于生產(chǎn)環(huán)境挣输,比如錯(cuò)誤恢復(fù)纬凤,狀態(tài)持久化等,所以在較新版本的Scala類庫中撩嚼,Akka包已經(jīng)取代了原生的Actor停士。

Akka

那下面我們來簡(jiǎn)單說說Akka吧,Akka作為一套成熟的并發(fā)解決方案完丽,已經(jīng)被業(yè)界大量采用恋技,尤其是在金融,游戲等領(lǐng)域逻族,Akka中的容錯(cuò)機(jī)制蜻底,持久化,遠(yuǎn)程調(diào)用聘鳞,日志等都是很重要的模塊薄辅,這些內(nèi)容都會(huì)在這個(gè)系列的后續(xù)文章里一一講解。下面就以一個(gè)入門Akka程序來結(jié)束本篇文章吧】倭В現(xiàn)在我們假設(shè)有一個(gè)家居機(jī)器人长搀,我們只需要給它發(fā)送消息它便會(huì)幫我們處理相應(yīng)的事情,現(xiàn)在我們用程序來模擬這個(gè)場(chǎng)景:源碼鏈接

本示例使用Scala語言鸡典,構(gòu)建工具為SBT源请,IDE為IntelliJ IDEA.

1.首先創(chuàng)建一個(gè)基于SBT的Scala工程

build.sbt配置:

name := "Example_01"

version := "1.0"

scalaVersion := "2.11.8"

val akkaVersion   = "2.4.16"

libraryDependencies +=
  "com.typesafe.akka" %% "akka-actor" % akkaVersion

2.我們來定義一些消息:

trait Action{
  val message: String
  val time: Int
}

case class TurnOnLight(time: Int) extends Action {   // 開燈消息
  val message = "Turn on the living room light"
}

case class BoilWater(time: Int) extends Action {   // 燒水消息
  val message = "Burn a pot of water"
}

3.我們利用Actor來實(shí)現(xiàn)一個(gè)模擬機(jī)器人:

class RobotActor extends Actor {
  val log = Logging(context.system, this)
  def receive: Receive = { //機(jī)器人接受指令
    case t: TurnOnLight => log.info(s"${t.message} after ${t.time} hour")
    case b: BoilWater => log.info(s"${b.message} after ${b.time} hour")
    case _ => log.info("I can not handle this message")
  }
}

4.我們?nèi)y(cè)試這個(gè)機(jī)器人:

object Example_01 extends App {
  val actorSyatem = ActorSystem("robot-system") 
  val robotActor = actorSyatem.actorOf(Props(new RobotActor()), "robotActor") //創(chuàng)建一個(gè)機(jī)器人
  robotActor ! TurnOnLight(1) //給機(jī)器人發(fā)送一個(gè)開燈命令
  robotActor ! BoilWater(2) //給機(jī)器人發(fā)送一個(gè)燒水命令
  robotActor ! "who are you" //給機(jī)器人發(fā)送一個(gè)任意命令
  actorSyatem terminate ()
}

5.運(yùn)行結(jié)果

[INFO] [03/19/2017 13:48:05.622] [robot-system-akka.actor.default-dispatcher-4] [akka://robot-system/user/robotActor] Turn on the living room light after 1 hour
[INFO] [03/19/2017 13:48:05.622] [robot-system-akka.actor.default-dispatcher-4] [akka://robot-system/user/robotActor] Burn a pot of water after 2 hour
[INFO] [03/19/2017 13:48:05.622] [robot-system-akka.actor.default-dispatcher-4] [akka://robot-system/user/robotActor] I can not handle this message

上面是一個(gè)非常簡(jiǎn)單的Akka例子,我們首先創(chuàng)建了一個(gè)機(jī)器人的Actor,然后通過向它發(fā)送不同指令谁尸,讓它根據(jù)指令去做相應(yīng)的事情舅踪,大家可以自己嘗試去寫一寫相似的例子。

這篇就先到這里了良蛮,下一篇主要給大家講講Akka中Actor的分層結(jié)構(gòu)抽碌。

文章允許轉(zhuǎn)載、使用决瞳,但需要保留文章署名 godpan.me,如有寫的不當(dāng)之處货徙,也歡迎大家指正,聯(lián)系郵箱:godpan.sen@gmail.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末皮胡,一起剝皮案震驚了整個(gè)濱河市痴颊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屡贺,老刑警劉巖蠢棱,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異甩栈,居然都是意外死亡泻仙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門量没,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玉转,“玉大人,你說我怎么就攤上這事殴蹄【孔ィ” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵饶套,是天一觀的道長(zhǎng)漩蟆。 經(jīng)常有香客問我,道長(zhǎng)妓蛮,這世上最難降的妖魔是什么怠李? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮蛤克,結(jié)果婚禮上捺癞,老公的妹妹穿的比我還像新娘。我一直安慰自己构挤,他們只是感情好髓介,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著筋现,像睡著了一般唐础。 火紅的嫁衣襯著肌膚如雪箱歧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天一膨,我揣著相機(jī)與錄音呀邢,去河邊找鬼。 笑死豹绪,一個(gè)胖子當(dāng)著我的面吹牛价淌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瞒津,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蝉衣,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了巷蚪?” 一聲冷哼從身側(cè)響起病毡,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钓辆,沒想到半個(gè)月后剪验,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肴焊,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡前联,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了娶眷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片似嗤。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖届宠,靈堂內(nèi)的尸體忽然破棺而出烁落,到底是詐尸還是另有隱情,我是刑警寧澤豌注,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布伤塌,位于F島的核電站,受9級(jí)特大地震影響轧铁,放射性物質(zhì)發(fā)生泄漏每聪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一齿风、第九天 我趴在偏房一處隱蔽的房頂上張望药薯。 院中可真熱鬧,春花似錦救斑、人聲如沸童本。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽穷娱。三九已至绑蔫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泵额,已是汗流浹背晾匠。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梯刚,地道東北人凉馆。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像亡资,于是被迫代替她去往敵國(guó)和親澜共。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 通過前幾篇的學(xué)習(xí)锥腻,相信大家對(duì)Akka應(yīng)該有所了解了嗦董,都說解決并發(fā)哪家強(qiáng),JVM上面找Akka瘦黑,那么Akka到底在解...
    三分青年閱讀 2,313評(píng)論 3 9
  • 這次把這部分內(nèi)容提到現(xiàn)在寫京革,是因?yàn)檫@段時(shí)間開發(fā)的項(xiàng)目剛好在這一塊遇到了一些難點(diǎn),所以準(zhǔn)備把經(jīng)驗(yàn)分享給大家幸斥,我們?cè)谑?..
    三分青年閱讀 1,648評(píng)論 4 3
  • 這段時(shí)間由于忙畢業(yè)前前后后的事情甲葬,拖更了很久廊勃,表示非常抱歉,回歸后的第一篇文章主要是看到了Akka最新文檔中寫的W...
    三分青年閱讀 2,964評(píng)論 0 5
  • Actor系統(tǒng)的實(shí)體 在Actor系統(tǒng)中经窖,actor之間具有樹形的監(jiān)管結(jié)構(gòu)坡垫,并且actor可以跨多個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)進(jìn)行透...
    JasonDing閱讀 3,341評(píng)論 2 6
  • 愛在生活的瑣細(xì)里 家有路癡 最近加入了一個(gè)免費(fèi)的英語口語訓(xùn)練群,每天一句画侣,學(xué)起來沒壓力也不累冰悠。 某天聽完語音后想嘗...
    燦爛jx閱讀 820評(píng)論 4 11