国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Akka系列(二):Akka中的Actor系統(tǒng)

BlackFlagBin / 1911人閱讀

摘要:模型作為中最核心的概念,所以在中的組織結(jié)構(gòu)也至關(guān)重要,本文主要介紹中系統(tǒng)。這里主要是演示可以根據(jù)配置文件的內(nèi)容去加載相應(yīng)的環(huán)境,并應(yīng)用到整個中,這對于我們配置環(huán)境來說是非常方便的。路徑與地址熟悉類系統(tǒng)的同學應(yīng)該對路徑這個概念很熟悉了。

Actor模型作為Akka中最核心的概念,所以Actor在Akka中的組織結(jié)構(gòu)也至關(guān)重要,本文主要介紹Akka中Actor系統(tǒng)。

Actor系統(tǒng)

Actor作為一種封裝狀態(tài)和行為的對象,總是需要一個系統(tǒng)去統(tǒng)一的組織和管理它們,在Akka中即為ActorSystem,其實這非常容易理解,好比一個公司,每個員工都可以看成一個Actor,它們有自己的職位和職責,但是我們需要把員工集合起來,統(tǒng)一進行管理和分配任務(wù),所以我們需要一個相應(yīng)的系統(tǒng)進行管理,好比這里的ActorSystem對Actor進行管理一樣。

ActorSystem的主要功能

ActorSystem主要有以下三個功能:

管理調(diào)度服務(wù)

配置相關(guān)參數(shù)

日志功能

1.管理調(diào)度服務(wù)

ActorSystem的的精髓在于將任務(wù)分拆,直到一個任務(wù)小到可以被完整處理,然后將其委托給Actor進行處理,所以ActorSystem最核心的一個功能就是管理和調(diào)度整個系統(tǒng)的運行,好比一個公司的管理者,他需要制定整個公司的發(fā)展計劃,還需要將工作分配給相應(yīng)的工作人員去完成,保障整個公司的正確運轉(zhuǎn),其實這里也體現(xiàn)了軟件設(shè)計中的分而治之,Actor中的核心思想也是這樣。

ActorSystem模型例子:

上圖是一個簡單的開發(fā)協(xié)作的過程,我覺得這個例子應(yīng)該可以清晰的表達Akka中Actor的組織結(jié)構(gòu),當然不僅于此。主要有以下幾個特點:

Akka中Actor的組織是一種樹形結(jié)構(gòu)

每個Actor都有父級,有可能有子級當然也可能沒有

父級Actor給其子級Actor分配資源,任務(wù),并管理其的生命狀態(tài)(監(jiān)管和監(jiān)控)

Actor系統(tǒng)往往有成千上萬個Actor,使用樹形機構(gòu)來組織管理Actor是非常適合的。

而且Akka天生就是分布式,你可以向一個遠程的Actor發(fā)送消息,但你需要知道這個Actor的具體位置在哪,這時候你就會發(fā)現(xiàn),樹形結(jié)構(gòu)對于確定一個Actor的路徑來說是非常有利(比如Linux的文件存儲),所以我覺得Actor用樹形結(jié)構(gòu)組織可以說是再完美不過了。

2.根據(jù)配置創(chuàng)建環(huán)境

一個完善的ActorSystem必須有相關(guān)的配置信息,比如使用的日志管理,不同環(huán)境打印的日志級別,攔截器,郵箱等等,Akka使用Typesafe配置庫,這是一個非常強大的配置庫,后續(xù)我也準備寫一篇后續(xù)文章,大家盡請期待哈。

下面用一個簡單的例子來說明一下ActorSystem會根據(jù)配置文件內(nèi)容去生成相應(yīng)的Actor系統(tǒng)環(huán)境:

1.首先我們按照默認配置打印一下系統(tǒng)的日志級別,搭建Akka環(huán)境請看我上一篇文章:Akka系列(一):Akka簡介與Actor模型

val actorSystem = ActorSystem("robot-system")
println(s"the ActorSystem logLevel is ${actorSystem.settings.LogLevel}")
  

運行結(jié)果:

the ActorSystem logLevel is INFO

可以看出ActorSystem默認的日志輸出級別是INFO

2.現(xiàn)在我們在application.conf里配置日志的輸出級別:

akka {

# Log level used by the configured loggers (see "loggers") as soon
# as they have been started; before that, see "stdout-loglevel"
# Options: OFF, ERROR, WARNING, INFO, DEBUG
loglevel = "DEBUG"
}

運行結(jié)果:

[DEBUG] [03/26/2017 12:07:12.434] [main] [EventStream(akka://robot-system)] logger log1-Logging$DefaultLogger started
[DEBUG] [03/26/2017 12:07:12.436] [main] [EventStream(akka://robot-system)] Default Loggers started
the ActorSystem logLevel is DEBUG

可以發(fā)現(xiàn)我們ActorSystem的日志輸出級別已經(jīng)變成了DEBUG
?
這里主要是演示ActorSystem可以根據(jù)配置文件的內(nèi)容去加載相應(yīng)的環(huán)境,并應(yīng)用到整個ActorSystem中,這對于我們配置ActorSystem環(huán)境來說是非常方便的。
?

3.日志功能

有很多人可能會疑惑,日志不應(yīng)該只是記錄程序運行狀態(tài)和排除錯誤的嘛,怎么在Akka中會變得至關(guān)重要,Akka擁有高容錯機制,這無疑需要完善的日志記錄才能使Actor出錯后能及時做出相應(yīng)的恢復策略,比如Akka中的持久化,具體相應(yīng)的一些作用我可能會在后續(xù)寫相應(yīng)章節(jié)的時候提到。

Actor引用,路徑和地址

有了上面的知識,這里了解Actor引用,路徑和地址就容易多了。

什么時Actor引用?

Actor引用是ActorRef的子類,每個Actor有唯一的ActorRef,Actor引用可以看成是Actor的代理,與Actor打交道都需要通過Actor引用,Actor引用可以幫對應(yīng)Actor發(fā)送消息,也可以接收消息,向Actor發(fā)送消息其實是將消息發(fā)送到Actor對應(yīng)的引用上,再由它將消息投寄到具體Actor的信箱中,所以ActorRef在整個Actor系統(tǒng)是一個非常重要的角色。

如何獲得Actor引用?

直接創(chuàng)建Actor

查找已經(jīng)存在的Actor

1.獲得ActorRef

看我上一篇文章的同學對這種方式獲得Actor引用應(yīng)該是比較了解,這里我會具體演示一下獲得ActorRef的幾種方式:

假定現(xiàn)在由這么一個場景:老板嗅到了市場上的一個商機,準備開啟一個新項目,他將要求傳達給了經(jīng)理,經(jīng)理根據(jù)相應(yīng)的需求,來安排適合的的員工進行工作。

這個例子很簡單,現(xiàn)在我們來模擬一下這個場景:

1.首先我們來創(chuàng)建一些消息:

trait Message {
  val content: String
}
case class Business(content: String) extends Message {}
case class Meeting(content: String) extends Message {}
case class Confirm(content: String, actorPath: ActorPath) extends Message {}
case class DoAction(content: String) extends Message {}
case class Done(content: String) extends Message {}

2.我們來創(chuàng)建一家公司,這里就是ActorSystem的化身:

val actorSystem = ActorSystem("company-system") //首先我們創(chuàng)建一家公司
//創(chuàng)建Actor得到ActorRef的一種方式,利用ActorSystem.actorOf
val bossActor = actorSystem.actorOf(Props[BossActor], "boss") //公司有一個Boss
bossActor ! Business("Fitness industry has great prospects") //從市場上觀察到健身行業(yè)將會有很大的前景
  

3.這里我們會創(chuàng)建幾種角色,比如上面Boss,這里我們還有Manager,Worker,讓我們來看看吧:

class BossActor extends Actor {
  val log = Logging(context.system, this)
  implicit val askTimeout = Timeout(5 seconds)
  import context.dispatcher
  var taskCount = 0
  def receive: Receive = {
    case b: Business =>
      log.info("I must to do some thing,go,go,go!")
      println(self.path.address)
      //創(chuàng)建Actor得到ActorRef的另一種方式,利用ActorContext.actorOf
      val managerActors = (1 to 3).map(i =>
        context.actorOf(Props[ManagerActor], s"manager${i}")) //這里我們召喚3個主管
      //告訴他們開會商量大計劃
      managerActors foreach {
        _ ? Meeting("Meeting to discuss big plans") map {
          case c: Confirm =>
            //為什么這里可以知道父級Actor的信息?
            //熟悉樹結(jié)構(gòu)的同學應(yīng)該知道每個節(jié)點有且只有一個父節(jié)點(根節(jié)點除外)
            log.info(c.actorPath.parent.toString)
            //根據(jù)Actor路徑查找已經(jīng)存在的Actor獲得ActorRef
            //這里c.actorPath是絕對路徑,你也可以根據(jù)相對路徑得到相應(yīng)的ActorRef
            val manager = context.actorSelection(c.actorPath)
            manager ! DoAction("Do thing")
        }
      }
    case d: Done => {
      taskCount += 1
      if (taskCount == 3) {
        log.info("the project is done, we will earn much money")
        context.system.terminate()
      }
    }
  }
}
class ManagerActor extends Actor {
  val log = Logging(context.system, this)
  def receive: Receive = {
    case m: Meeting =>
      sender() ! Confirm("I have receive command", self.path)
    case d: DoAction =>
      val workerActor = context.actorOf(Props[WorkerActor], "worker")
      workerActor forward d
  }
}

class WorkerActor extends Actor {
  val log = Logging(context.system, this)
  def receive: Receive = {
    case d: DoAction =>
      log.info("I have receive task")
      sender() ! Done("I hava done work")
  }
}

光看這段代碼可能不那么容易理解,這里我會畫一個流程圖幫助你理解這段程序:

程序流程圖:

看了上面的流程圖對程序應(yīng)該有所了解了,過多的解釋我這里就不講解了,可以看注釋,或者下載源代碼自己去跑一跑。源碼鏈接

這里主要是有兩個知識點:

創(chuàng)建Actor獲得ActorRef的兩種方式

根據(jù)Actor路徑獲得ActorRef

前一個知識點應(yīng)該比較清晰了,具體來說說第二個。

2.Actor路徑與地址

熟悉類Unix系統(tǒng)的同學應(yīng)該對路徑這個概念很熟悉了。ActorSystem中的路徑也很類似,每個ActorSystem都有一個根守護者,用/表示,在根守護者下有一個名user的Actor,它是所有system.actorOf()創(chuàng)建的父Actor,所以我們程序中bossActor的路徑為:

/user/boss

地址顧名思義是Actor所在的位置,為什么要有地址這一個概念,這就是Akka強大的理念了,Akka中所有的東西都是被設(shè)計為在分布式環(huán)境下工作的,所以我們可以向任意位置的Actor發(fā)送消息(前提你得知道它在哪),這時候地址的作用就顯現(xiàn)出來來,首先我們可以根據(jù)地址找到Actor在什么位置,再根據(jù)路徑找到具體的Actor,比如我們示例程序中bossActor,它的完整位置是

akka://company-system/user/boss

可以發(fā)現(xiàn)它的地址是

akka://company-system

其中akka代表純本地的,Akka中默認遠程Actor的位置一般用akka.tcp或者akka.udp開頭,當然你也可以使用第三方插件,Akka的遠程調(diào)用我也會專門寫一篇文章。

總的來說這一篇文章主要是講解了ActorSystem的基礎(chǔ)結(jié)構(gòu),相關(guān)配置,以及Actor引用,路徑和地址等比較基礎(chǔ)的知識點,這其實對理解整個Actor系統(tǒng)是如何運行的是很有幫助的,博主也是寫了好久,爭取寫的通俗容易理解一點,希望能得到大家的支持,下一篇準備寫一下Actor的監(jiān)管和監(jiān)控以及它的生命周期。有興趣的同學也可以關(guān)注我的個人博客

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/76408.html

相關(guān)文章

  • Akka系列(三):監(jiān)管與容錯

    摘要:是所有由系統(tǒng)創(chuàng)建的頂級的監(jiān)管者,如日志監(jiān)聽器,或由配置指定在系統(tǒng)啟動時自動部署的。所有其他被上升到根監(jiān)管者,然后整個系統(tǒng)將會關(guān)閉。監(jiān)管容錯示例本示例主要演示在發(fā)生錯誤時,它的監(jiān)管者會根據(jù)相應(yīng)的監(jiān)管策略進行不同的處理。 Akka作為一種成熟的生產(chǎn)環(huán)境并發(fā)解決方案,必須擁有一套完善的錯誤異常處理機制,本文主要講講Akka中的監(jiān)管和容錯。 監(jiān)管 看過我上篇文章的同學應(yīng)該對Actor系統(tǒng)的工作...

    shevy 評論0 收藏0
  • Akka系列(一):Akka簡介與Actor模型

    摘要:是一個構(gòu)建在上,基于模型的的并發(fā)框架,為構(gòu)建伸縮性強,有彈性的響應(yīng)式并發(fā)應(yīng)用提高更好的平臺。上述例子中的信件就相當于中的消息,與之間只能通過消息通信。當然模型比這要復雜的多,這里主要是簡潔的闡述一下模型的概念。模型的出現(xiàn)解決了這個問題。 Akka是一個構(gòu)建在JVM上,基于Actor模型的的并發(fā)框架,為構(gòu)建伸縮性強,有彈性的響應(yīng)式并發(fā)應(yīng)用提高更好的平臺。本文主要是個人對Akka的學習和應(yīng)...

    PingCAP 評論0 收藏0
  • Akka系列(七):Actor持久化之Akka persistence

    摘要:源碼鏈接進階持久化插件有同學可能會問,我對不是很熟悉亦或者覺得單機存儲并不是安全,有沒有支持分布式數(shù)據(jù)存儲的插件呢,比如某爸的云數(shù)據(jù)庫答案當然是有咯,良心的我當然是幫你們都找好咯。 這次把這部分內(nèi)容提到現(xiàn)在寫,是因為這段時間開發(fā)的項目剛好在這一塊遇到了一些難點,所以準備把經(jīng)驗分享給大家,我們在使用Akka時,會經(jīng)常遇到一些存儲Actor內(nèi)部狀態(tài)的場景,在系統(tǒng)正常運行的情況下,我們不需要...

    miguel.jiang 評論0 收藏0
  • Akka系列(四):Akka中的共享內(nèi)存模型

    摘要:共享內(nèi)存相信對并發(fā)有所了解的同學都應(yīng)該知道在推出后,對內(nèi)存管理有了更高標準的規(guī)范了,這使我們開發(fā)并發(fā)程序也有更好的標準了,不會有一些模糊的定義導致的無法確定的錯誤。 通過前幾篇的學習,相信大家對Akka應(yīng)該有所了解了,都說解決并發(fā)哪家強,JVM上面找Akka,那么Akka到底在解決并發(fā)問題上幫我們做了什么呢? 共享內(nèi)存 眾所周知,在處理并發(fā)問題上面,最核心的一部分就是如何處理共享內(nèi)存,...

    baukh789 評論0 收藏0
  • Akka系列(六):Actor解決了什么問題?

    摘要:原文鏈接解決了什么問題使用模型來克服傳統(tǒng)面向?qū)ο缶幊棠P偷木窒扌裕?yīng)對高并發(fā)分布式系統(tǒng)所帶來的挑戰(zhàn)。在某些情況,這個問題可能會變得更糟糕,工作線程發(fā)生了錯誤但是其自身卻無法恢復。 這段時間由于忙畢業(yè)前前后后的事情,拖更了很久,表示非常抱歉,回歸后的第一篇文章主要是看到了Akka最新文檔中寫的What problems does the actor model solve?,閱讀完后覺...

    Carson 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<