摘要:是一個構建在上,基于模型的的并發(fā)框架,為構建伸縮性強,有彈性的響應式并發(fā)應用提高更好的平臺。上述例子中的信件就相當于中的消息,與之間只能通過消息通信。當然模型比這要復雜的多,這里主要是簡潔的闡述一下模型的概念。模型的出現(xiàn)解決了這個問題。
Akka是一個構建在JVM上,基于Actor模型的的并發(fā)框架,為構建伸縮性強,有彈性的響應式并發(fā)應用提高更好的平臺。本文主要是個人對Akka的學習和應用中的一些理解。
Actor模型Akka的核心就是Actor,所以不得不說Actor,Actor模型我通俗的舉個例子,假定現(xiàn)實中的兩個人,他們只知道對方的地址,他們想要交流,給對方傳遞信息,但是又沒有手機,電話,網(wǎng)絡之類的其他途徑,所以他們之間只能用信件傳遞消息,很像現(xiàn)實中的的郵政系統(tǒng),你要寄一封信,只需根據(jù)地址把信投寄到相應的信箱中,具體它是如何幫你處理送達的,你就不需要了解了,你也有可能收到收信人的回復,這相當于消息反饋。上述例子中的信件就相當于Actor中的消息,Actor與Actor之間只能通過消息通信。當然Actor模型比這要復雜的多,這里主要是簡潔的闡述一下Actor模型的概念。
Akka中Actors模型對并發(fā)模型進行了更高的抽象
異步、非阻塞、高性能的事件驅(qū)動編程模型
輕量級事件處理(1GB內(nèi)存可容納百萬級別個Actor)
為什么Actor模型是一種處理并發(fā)問題的解決方案?
一開始我也不怎么理解,腦子里的一貫思維是處理并發(fā)問題就是如何保證共享數(shù)據(jù)的一致性和正確性,為什么會有保持共享數(shù)據(jù)正確性這個問題呢?無非是我們的程序是多線程的,多個線程對同一個數(shù)據(jù)進行修改,若不加同步條件,勢必會造成數(shù)據(jù)污染。那么我們是不是可以轉(zhuǎn)換一下思維,用單線程去處理相應的請求,但是又有人會問了,若是用單線程處理,那系統(tǒng)的性能又如何保證。Actor模型的出現(xiàn)解決了這個問題。
Actor模型概圖:
從上圖中我們可以看到,Actor與Actor之前只能用消息進行通信,當某一個Actor給另外一個Actor發(fā)消息,消息是有順序的,你只需要將消息投寄的相應的郵箱,至于對方Actor怎么處理你的消息你并不知道,當然你也可等待它的回復。
JVM中的Actor有以下幾個特點:
每個Actor都有對應一個郵箱
Actor是串行處理消息的
Actor中的消息是不可變的
其實只從上面一些描述來看,并不能看出Actor在處理并發(fā)問題上的有什么優(yōu)勢。
但我總結了兩點:簡化并發(fā)編程,提升程序性能
我們一開始說過并發(fā)導致最大的問題就是對共享數(shù)據(jù)的操作,我們在面對并發(fā)問題時多采用的是
用鎖去保證共享數(shù)據(jù)的一致性,但這同樣也會帶來其他相關問題,比如要去考慮鎖的粒度(對方法,程序塊等),鎖的形式(讀鎖,寫鎖等)等問題,這些問題對并發(fā)程序來說是至關重要的,但一個初寫并發(fā)程序的程序員來說,往往不能掌控的很好,這無疑給程序員在編程上提高了復雜性,而且還不容易掌控,但使用Actor就不導致這些問題,首先Actor的消息特性就覺得了在與Actor通信上不會有共享數(shù)據(jù)的困擾,另外在Actor內(nèi)部是串行處理消息的,同樣不會對Actor內(nèi)的數(shù)據(jù)造成污染,用Actor編寫并發(fā)程序無疑大大降低了編碼的復雜度。
我們之前說過既然用單線程處理,那如何保證程序的性能?首先Actor是非常輕量級的,你可以再程序中創(chuàng)建許多個Actor,而且Actor是異步的,那么如何利用它的這個特性呢,我們要做的就是把相應的并發(fā)事件盡可能的分割成一個個小的事件,讓每個Actor去處理相應的小事件,充分去利用它異步的特點,來提升程序的性能。
其實Scala中原生的Actor并不能完成很多事,不是一套完整的并發(fā)解決方案,不適合用于生產(chǎn)環(huán)境,比如錯誤恢復,狀態(tài)持久化等,所以在較新版本的Scala類庫中,Akka包已經(jīng)取代了原生的Actor。
Akka那下面我們來簡單說說Akka吧,Akka作為一套成熟的并發(fā)解決方案,已經(jīng)被業(yè)界大量采用,尤其是在金融,游戲等領域,Akka中的容錯機制,持久化,遠程調(diào)用,日志等都是很重要的模塊,這些內(nèi)容都會在這個系列的后續(xù)文章里一一講解。下面就以一個入門Akka程序來結束本篇文章吧。現(xiàn)在我們假設有一個家居機器人,我們只需要給它發(fā)送消息它便會幫我們處理相應的事情,現(xiàn)在我們用程序來模擬這個場景:源碼鏈接
本示例使用Scala語言,構建工具為SBT,IDE為IntelliJ IDEA.
1.首先創(chuàng)建一個基于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來實現(xiàn)一個模擬機器人:
class RobotActor extends Actor { val log = Logging(context.system, this) def receive: Receive = { //機器人接受指令 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試這個機器人:
object Example_01 extends App { val actorSyatem = ActorSystem("robot-system") val robotActor = actorSyatem.actorOf(Props(new RobotActor()), "robotActor") //創(chuàng)建一個機器人 robotActor ! TurnOnLight(1) //給機器人發(fā)送一個開燈命令 robotActor ! BoilWater(2) //給機器人發(fā)送一個燒水命令 robotActor ! "who are you" //給機器人發(fā)送一個任意命令 actorSyatem terminate () }
5.運行結果
[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
上面是一個非常簡單的Akka例子,我們首先創(chuàng)建了一個機器人的Actor,然后通過向它發(fā)送不同指令,讓它根據(jù)指令去做相應的事情,大家可以自己嘗試去寫一寫相似的例子。
這篇就先到這里了,下一篇主要給大家講講Akka中Actor的分層結構。有興趣的同學也可以關注我的個人博客
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69953.html
摘要:模型作為中最核心的概念,所以在中的組織結構也至關重要,本文主要介紹中系統(tǒng)。這里主要是演示可以根據(jù)配置文件的內(nèi)容去加載相應的環(huán)境,并應用到整個中,這對于我們配置環(huán)境來說是非常方便的。路徑與地址熟悉類系統(tǒng)的同學應該對路徑這個概念很熟悉了。 Actor模型作為Akka中最核心的概念,所以Actor在Akka中的組織結構也至關重要,本文主要介紹Akka中Actor系統(tǒng)。 Actor系統(tǒng) Act...
摘要:關于三者的一些概括總結離線分析框架,適合離線的復雜的大數(shù)據(jù)處理內(nèi)存計算框架,適合在線離線快速的大數(shù)據(jù)處理流式計算框架,適合在線的實時的大數(shù)據(jù)處理我是一個以架構師為年之內(nèi)目標的小小白。 整理自《架構解密從分布式到微服務》第七章——聊聊分布式計算.做了相應補充和修改。 [TOC] 前言 不管是網(wǎng)絡、內(nèi)存、還是存儲的分布式,它們最終目的都是為了實現(xiàn)計算的分布式:數(shù)據(jù)在各個計算機節(jié)點上流動,同...
摘要:共享內(nèi)存相信對并發(fā)有所了解的同學都應該知道在推出后,對內(nèi)存管理有了更高標準的規(guī)范了,這使我們開發(fā)并發(fā)程序也有更好的標準了,不會有一些模糊的定義導致的無法確定的錯誤。 通過前幾篇的學習,相信大家對Akka應該有所了解了,都說解決并發(fā)哪家強,JVM上面找Akka,那么Akka到底在解決并發(fā)問題上幫我們做了什么呢? 共享內(nèi)存 眾所周知,在處理并發(fā)問題上面,最核心的一部分就是如何處理共享內(nèi)存,...
摘要:源碼鏈接進階持久化插件有同學可能會問,我對不是很熟悉亦或者覺得單機存儲并不是安全,有沒有支持分布式數(shù)據(jù)存儲的插件呢,比如某爸的云數(shù)據(jù)庫答案當然是有咯,良心的我當然是幫你們都找好咯。 這次把這部分內(nèi)容提到現(xiàn)在寫,是因為這段時間開發(fā)的項目剛好在這一塊遇到了一些難點,所以準備把經(jīng)驗分享給大家,我們在使用Akka時,會經(jīng)常遇到一些存儲Actor內(nèi)部狀態(tài)的場景,在系統(tǒng)正常運行的情況下,我們不需要...
摘要:原文鏈接解決了什么問題使用模型來克服傳統(tǒng)面向?qū)ο缶幊棠P偷木窒扌?,并應對高并發(fā)分布式系統(tǒng)所帶來的挑戰(zhàn)。在某些情況,這個問題可能會變得更糟糕,工作線程發(fā)生了錯誤但是其自身卻無法恢復。 這段時間由于忙畢業(yè)前前后后的事情,拖更了很久,表示非常抱歉,回歸后的第一篇文章主要是看到了Akka最新文檔中寫的What problems does the actor model solve?,閱讀完后覺...
閱讀 3893·2021-09-27 13:36
閱讀 4627·2021-09-22 15:12
閱讀 3072·2021-09-13 10:29
閱讀 1840·2021-09-10 10:50
閱讀 2374·2021-09-03 10:43
閱讀 528·2019-08-29 17:10
閱讀 453·2019-08-26 13:52
閱讀 3265·2019-08-23 14:37