TOP

Akka(8): 分布式運算:Remoting-遠程查找式(一)
2017-10-09 14:06:30 】 瀏覽:9906
Tags:

  Akka是一種消息驅動運算模式,它實現跨JVM程序運算的方式是通過能跨JVM的消息系統來調動分布在不同JVM上ActorSystem中的Actor進行運算优乐棋牌app下载,前題是Akka的地址系統可以支持跨JVM定位。Akka的消息系統最高境界可以實現所謂的Actor位置透明化,這樣在Akka編程中就無須關注Actor具體在哪個JVM上運行,分布式Actor編程從方式上跟普通Actor編程就不會有什么區別了。Akka的Remoting是一種點對點的跨JVM消息通道,讓一個JVM上ActorSystem中的某個Actor可以連接另一個JVM上ActorSystem中的另一個Actor。兩個JVM上的ActorSystem之間只需具備TCP網絡連接功能就可以實現Akka Remoting了。Akka-Remoting還沒有實現完全的位置透明化,因為用戶還必須在代碼里或者配置文件里指明目標Actor的具體地址。

Akka-Remoting提供了兩種Actor之間的溝通方法:

1、遠程查找:通過路徑Path查找在遠程機上已經創建存在的Actor优乐棋牌app下载,獲取ActorRef后進行溝通

2、遠程創建:在遠程機上直接創建Actor作為溝通對象

Akka-Remoting的主要應用應該是把一些任務部署到遠程機上去運算。發起方(Local JVM)在這里面的主要作用是任務分配,有點像Akka-Router。我們可以用下面的例子來示范:模擬一個計算器,可以進行連續的加減乘除,保留累計結果。我們會把這個計算器部署到遠程機上,然后從本機與之溝通分配運算任務及獲取運算結果。這個計算器就是個簡單的Actor:

import akka.actor._ object Calculator { sealed trait MathOps case class Num(dnum: Double) extends MathOps case class Add(dnum: Double) extends MathOps case class Sub(dnum: Double) extends MathOps case class Mul(dnum: Double) extends MathOps case class Div(dnum: Double) extends MathOps sealed trait CalcOps case object Clear extends CalcOps case object GetResult extends CalcOps } class Calcultor extends Actor { import Calculator._ var result: Double = 0.0   //internal state
  override def receive: Receive = { case Num(d) => result = d case Add(d) => result += d case Sub(d) => result -= d case Mul(d) => result *= d case Div(d) => result = result / d case Clear => result = 0.0
    case GetResult => sender() ! s"Result of calculation is: $result" } }

就是一個簡單的Actor實現,跟Remoting沒什么關系。

下面我們會在一個遠程機上部署這個Calculator Actor。 先看看這個示范的項目結構:remoteLookup/build.sbt

lazy val commonSettings = seq ( name := "RemoteLookupDemo", version := "1.0", scalaVersion := "2.11.8", libraryDependencies := Seq( "com.typesafe.akka" %% "akka-actor" % "2.5.2", "com.typesafe.akka" %% "akka-remote" % "2.5.2" ) ) lazy val local = (project in file(".")) .settings(commonSettings) .settings( name := "localSystem" ).aggregate(messages,remote).dependsOn(messages) lazy val messages = (project in file("messages")) .settings(commonSettings) .settings( name := "commands" ) lazy val remote = (project in file("remote")) .settings(commonSettings) .settings( name := "remoteSystem" ).aggregate(messages).dependsOn(messages)

 在這里我們分了三個項目:local是主項目,messages和remote是分項目(subprojects)。messages里只有OpsMessages.scala一個源文件:

package remoteLookup.messages object Messages { sealed trait MathOps case class Num(dnum: Double) extends MathOps case class Add(dnum: Double) extends MathOps case class Sub(dnum: Double) extends MathOps case class Mul(dnum: Double) extends MathOps case class Div(dnum: Double) extends MathOps sealed trait CalcOps case object Clear extends CalcOps case object GetResult extends CalcOps }

我們看到:這個文件是把上面的Calculator支持的消息拆了出來。這是因為Calculator Actor會在另一個JVM remote上部署优乐棋牌app下载,而我們會從local JVM里向Calculator發送操作消息,所以Messages必須是local和remote共享的。這個要求我們通過dependOn(messages)實現了。現在Calculator是在remote項目里定義的:remote/Calculator.scala

package remoteLookup.remote import akka.actor._ import remoteLookup.messages.Messages._ object CalcProps { def props = Props(new Calcultor) } class Calcultor extends Actor with ActorLogging { var  
		

請關注公眾號獲取更多資料



首頁 上一頁 1 2 3 4 5 6 下一頁 尾頁 1/6/6
】【打印繁體】【】【】 【】【】【】 【關閉】 【返回頂部
上一篇spark獲取時間 下一篇sbt 學習筆記(1)sbt安裝和交互..