摘要:是一個(gè)構(gòu)建在上,基于模型的的并發(fā)框架,為構(gòu)建伸縮性強(qiáng),有彈性的響應(yīng)式并發(fā)應(yīng)用提高更好的平臺(tái)。上述例子中的信件就相當(dāng)于中的消息,與之間只能通過消息通信。當(dāng)然模型比這要復(fù)雜的多,這里主要是簡(jiǎn)潔的闡述一下模型的概念。模型的出現(xiàn)解決了這個(gè)問題。
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)存可容納百萬(wàn)級(jí)別個(gè)Actor)
為什么Actor模型是一種處理并發(fā)問題的解決方案?
一開始我也不怎么理解,腦子里的一貫思維是處理并發(fā)問題就是如何保證共享數(shù)據(jù)的一致性和正確性,為什么會(huì)有保持共享數(shù)據(jù)正確性這個(gè)問題呢?無(wú)非是我們的程序是多線程的,多個(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與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ā)編程,提升程序性能
我們一開始說過并發(fā)導(dǎo)致最大的問題就是對(duì)共享數(shù)據(jù)的操作,我們?cè)诿鎸?duì)并發(fā)問題時(shí)多采用的是
用鎖去保證共享數(shù)據(jù)的一致性,但這同樣也會(huì)帶來其他相關(guān)問題,比如要去考慮鎖的粒度(對(duì)方法,程序塊等),鎖的形式(讀鎖,寫鎖等)等問題,這些問題對(duì)并發(fā)程序來說是至關(guān)重要的,但一個(gè)初寫并發(fā)程序的程序員來說,往往不能掌控的很好,這無(wú)疑給程序員在編程上提高了復(fù)雜性,而且還不容易掌控,但使用Actor就不導(dǎo)致這些問題,首先Actor的消息特性就覺得了在與Actor通信上不會(huì)有共享數(shù)據(jù)的困擾,另外在Actor內(nèi)部是串行處理消息的,同樣不會(huì)對(duì)Actor內(nèi)的數(shù)據(jù)造成污染,用Actor編寫并發(fā)程序無(wú)疑大大降低了編碼的復(fù)雜度。
我們之前說過既然用單線程處理,那如何保證程序的性能?首先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類庫(kù)中,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語(yǔ)言,構(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)。有興趣的同學(xué)也可以關(guān)注我的個(gè)人博客
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/69953.html
摘要:模型作為中最核心的概念,所以在中的組織結(jié)構(gòu)也至關(guān)重要,本文主要介紹中系統(tǒng)。這里主要是演示可以根據(jù)配置文件的內(nèi)容去加載相應(yīng)的環(huán)境,并應(yīng)用到整個(gè)中,這對(duì)于我們配置環(huán)境來說是非常方便的。路徑與地址熟悉類系統(tǒng)的同學(xué)應(yīng)該對(duì)路徑這個(gè)概念很熟悉了。 Actor模型作為Akka中最核心的概念,所以Actor在Akka中的組織結(jié)構(gòu)也至關(guān)重要,本文主要介紹Akka中Actor系統(tǒng)。 Actor系統(tǒng) Act...
摘要:關(guān)于三者的一些概括總結(jié)離線分析框架,適合離線的復(fù)雜的大數(shù)據(jù)處理內(nèi)存計(jì)算框架,適合在線離線快速的大數(shù)據(jù)處理流式計(jì)算框架,適合在線的實(shí)時(shí)的大數(shù)據(jù)處理我是一個(gè)以架構(gòu)師為年之內(nèi)目標(biāo)的小小白。 整理自《架構(gòu)解密從分布式到微服務(wù)》第七章——聊聊分布式計(jì)算.做了相應(yīng)補(bǔ)充和修改。 [TOC] 前言 不管是網(wǎng)絡(luò)、內(nèi)存、還是存儲(chǔ)的分布式,它們最終目的都是為了實(shí)現(xiàn)計(jì)算的分布式:數(shù)據(jù)在各個(gè)計(jì)算機(jī)節(jié)點(diǎn)上流動(dòng),同...
摘要:共享內(nèi)存相信對(duì)并發(fā)有所了解的同學(xué)都應(yīng)該知道在推出后,對(duì)內(nèi)存管理有了更高標(biāo)準(zhǔn)的規(guī)范了,這使我們開發(fā)并發(fā)程序也有更好的標(biāo)準(zhǔn)了,不會(huì)有一些模糊的定義導(dǎo)致的無(wú)法確定的錯(cuò)誤。 通過前幾篇的學(xué)習(xí),相信大家對(duì)Akka應(yīng)該有所了解了,都說解決并發(fā)哪家強(qiáng),JVM上面找Akka,那么Akka到底在解決并發(fā)問題上幫我們做了什么呢? 共享內(nèi)存 眾所周知,在處理并發(fā)問題上面,最核心的一部分就是如何處理共享內(nèi)存,...
摘要:源碼鏈接進(jìn)階持久化插件有同學(xué)可能會(huì)問,我對(duì)不是很熟悉亦或者覺得單機(jī)存儲(chǔ)并不是安全,有沒有支持分布式數(shù)據(jù)存儲(chǔ)的插件呢,比如某爸的云數(shù)據(jù)庫(kù)答案當(dāng)然是有咯,良心的我當(dāng)然是幫你們都找好咯。 這次把這部分內(nèi)容提到現(xiàn)在寫,是因?yàn)檫@段時(shí)間開發(fā)的項(xiàng)目剛好在這一塊遇到了一些難點(diǎn),所以準(zhǔn)備把經(jīng)驗(yàn)分享給大家,我們?cè)谑褂肁kka時(shí),會(huì)經(jīng)常遇到一些存儲(chǔ)Actor內(nèi)部狀態(tài)的場(chǎng)景,在系統(tǒng)正常運(yùn)行的情況下,我們不需要...
摘要:原文鏈接解決了什么問題使用模型來克服傳統(tǒng)面向?qū)ο缶幊棠P偷木窒扌裕?yīng)對(duì)高并發(fā)分布式系統(tǒng)所帶來的挑戰(zhàn)。在某些情況,這個(gè)問題可能會(huì)變得更糟糕,工作線程發(fā)生了錯(cuò)誤但是其自身卻無(wú)法恢復(fù)。 這段時(shí)間由于忙畢業(yè)前前后后的事情,拖更了很久,表示非常抱歉,回歸后的第一篇文章主要是看到了Akka最新文檔中寫的What problems does the actor model solve?,閱讀完后覺...
閱讀 3878·2021-09-27 13:36
閱讀 4554·2021-09-22 15:12
閱讀 3063·2021-09-13 10:29
閱讀 1826·2021-09-10 10:50
閱讀 2360·2021-09-03 10:43
閱讀 518·2019-08-29 17:10
閱讀 442·2019-08-26 13:52
閱讀 3249·2019-08-23 14:37