【问题标题】:scala- how to subscribe akka leader up eventscala-如何订阅akka leader up事件
【发布时间】:2013-10-16 15:34:21
【问题描述】:

我正在使用 akka 进行游戏。而且我希望新领导者上任时只做一次事情

我会找到类似的东西,换句话说,我正在寻找类似的东西。

class LeaderUpHook {   
    def onLeaderUp {
        log.log("a new leader is up")   
   } 
}

我搜索了聚类文档,但仍然不知道该怎么做

【问题讨论】:

    标签: scala playframework-2.0 akka akka-cluster


    【解决方案1】:

    您应该能够使用集群事件来解决这个问题。我的代码示例基于文档hereSubscribe to Cluster Events 部分下的文档。所以简而言之,您基本上创建了一个订阅相关集群事件的参与者,以确定领导者是谁以及该领导者何时启动。该演员可能看起来像这样:

    import akka.actor._
    import akka.cluster._
    
    class LeaderUpHandler extends Actor{
      import ClusterEvent._
    
      val cluster = Cluster(context.system)
      cluster.subscribe(self, classOf[MemberUp])
      cluster.subscribe(self, classOf[LeaderChanged])
      var leader:Option[Address] = None
    
      def receive = {
        case  state:CurrentClusterState => 
          println(s"Got current state: $state")
    
        case MemberUp(member) =>
          println(s"member up: $member")
          leader.filter(_ == member.address) foreach{ address => 
            println("leader is now up...")
          }
    
        case LeaderChanged(address) => 
          println(s"leader changed: $address")
          leader = address
      }
    }
    

    然后要测试此代码,您可以执行以下操作:

    val cfg = """
      akka {
          actor {
            provider = "akka.cluster.ClusterActorRefProvider"               
          }
          remote {
            netty.tcp {
                hostname = "127.0.0.1"
                port = 2552 
            }    
          }
          cluster {
            seed-nodes = [
                "akka.tcp://clustertest@127.0.0.1:2552"
              ]
            auto-down = on
          }     
      }    
    
    """
    val config = ConfigFactory.parseString(cfg).withFallback(ConfigFactory.load)
    val system = ActorSystem("clustertest", config)
    system.actorOf(Props[LeaderUpHandler])  
    

    当您运行上述代码时,您应该会看到领导者下定决心要站起来。这是一个过于简单的例子;我只是想表明您可以使用集群事件来查找您要查找的内容。

    【讨论】:

    • 是否需要在leader中添加@volatile
    • 为什么?这是一个演员。它一次处理一个邮箱。对领导变量的并发访问不是问题。它是私有的可变状态,只有这个 actor 实例可以访问。
    • 这两个事件可能由不同的线程处理,所以,我认为使用 volatile 可以防止一些缓存
    • 阅读此文档,您将在其中看到演员中的字段不需要标记为易失性。 doc.akka.io/docs/akka/2.2.3/general/jmm.html
    • 看来我必须订阅 CurrentClusterState,否则我无法在集群刚刚启动时接收到领导者
    猜你喜欢
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多