TOP

Akka(12): 分布式運算:Cluster-Singleton-讓運算在集群節點中自動轉移(一)
2017-10-09 13:50:39 】 瀏覽:10379
Tags:

  在很多應用場景中都會出現在系統中需要某類Actor的唯一實例(only instance)。這個實例在集群環境中可能在任何一個節點上,但保證它是唯一的。Akka的Cluster-Singleton提供對這種Singleton Actor模式的支持,能做到當這個實例所在節點出現問題需要脫離集群時自動在另一個節點上構建一個同樣的Actor优乐棋牌app下载,并重新轉交控制。當然,由于涉及了一個新構建的Actor,內部狀態會在這個過程中丟失。Single-Actor的主要應用包括某種對外部只能支持一個接入的程序接口,或者一種帶有由多個其它Actor運算結果產生的內部狀態的累積型Actor(aggregator)。當然,如果使用一種帶有內部狀態的Singleton-Actor,可以考慮使用PersistenceActor來實現內部狀態的自動恢復。如此Cluster-Singleton變成了一種非常實用的模式,可以在許多場合下應用。

  Cluster-Singleton模式也恰恰因為它的唯一性特點存在著一些隱憂优乐棋牌app下载,需要特別關注。唯一性容易造成的隱憂包括:容易造成超負荷、無法保證穩定在線、無法保證消息投遞。這些需要用戶在編程時增加特別處理。

好了,我們設計個例子來了解Cluster-Singleton,先看看Singleton-Actor的功能:

class SingletonActor extends PersistentActor with ActorLogging { import SingletonActor._ val cluster = Cluster(context.system) var freeHoles = 0
  var freeTrees = 0
  var ttlMatches = 0
  override def persistenceId = self.path.parent.name + "-" + self.path.name def updateState(evt: Event): Unit = evt match { case AddHole =>
      if (freeTrees > 0) { ttlMatches += 1 freeTrees -= 1 } else freeHoles += 1
    case AddTree =>
      if (freeHoles > 0) { ttlMatches += 1 freeHoles -= 1 } else freeTrees += 1 } override def receiveRecover: Receive = { case evt: Event => updateState(evt) case SnapshotOffer(_,ss: State) => freeHoles = ss.nHoles freeTrees = ss.nTrees ttlMatches = ss.nMatches } override def receiveCommand: Receive = { case Dig => persist(AddHole){evt => updateState(evt) } sender() ! AckDig   //notify sender message received
      log.info(s"State on ${cluster.selfAddress}:freeHoles=$freeHoles,freeTrees=$freeTrees,ttlMatches=$ttlMatches") case Plant => persist(AddTree) {evt => updateState(evt) } sender() ! AckPlant   //notify sender message received
      log.info(s"State on ${cluster.selfAddress}:freeHoles=$freeHoles,freeTrees=$freeTrees,ttlMatches=$ttlMatches") case Disconnect =>  //this node exits cluster. expect switch to another node
      log.info(s"${cluster.selfAddress} is leaving cluster ...") cluster.leave(cluster.selfAddress) case CleanUp =>
      //clean up ...
      self ! PoisonPill } }

這個SingletonActor就是一種特殊的Actor优乐棋牌app下载,它繼承了PersistentActor,所以需要實現PersistentActor的抽象函數。SingletonActor維護了幾個內部狀態,分別是各類運算的當前累積結果freeHoles,freeTrees,ttlMatches。SingletonActor模擬的是一個種樹場景:當收到Dig指令后產生登記樹坑AddHole事件,在這個事件中更新當前狀態值;當收到Plant指令后產生AddTree事件并更新狀態。因為Cluster-Singleton模式無法保證消息安全投遞所以應該加個回復機制AckDig,AckPlant讓消息發送者可用根據情況補發消息。我們是用Cluster.selfAddress來確認當前集群節點的轉換。

我們需要在所有承載SingletonActor的集群節點上構建部署ClusterSingletonManager,如下:

  def create(port: Int) = { val config = ConfigFactory.parseString(s"akka.remote.netty.tcp.port=$port") .withFallback(ConfigFactory.parseString("akka.cluster.roles=[singleton]")) .withFallback(ConfigFactory.load()) val singletonSystem = ActorSystem("SingletonClusterSystem",config) startupSharedJournal(singletonSystem, (port == 2551), path = ActorPath.fromString("akka.tcp://SingletonClusterSystem@127.0.0.1:2551/user/store")) val singletonManager = singletonSystem.actorOf(ClusterSingletonManager.props( singletonProps = Props[SingletonActor], terminationMessage = CleanUp, settings = ClusterSingletonManagerSettings(singletonSystem).withRole(Some("singleton")) ), name = "singletonManager") }

可以看的出來,Cluste

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



首頁 上一頁 1 2 3 4 5 6 下一頁 尾頁 1/6/6
】【打印繁體】【】【】 【】【】【】 【關閉】 【返回頂部
上一篇Akka(10): 分布式運算:集群-C.. 下一篇scala 基礎一 val常量和var變量的..