2017-03-21 47 views
0

正確的方式我嘗試實施方案的阿卡集羣啓動:什麼是阿卡集羣辛格爾頓啓動

  1. 運行羣集種簡單的演員(集羣監控,這表明其他成員的加入)
  2. 運行一些羣集成員,它採用ClusterSingletonManagerClusterSingletonProxy演員爲Singleton實施

但是我有一個問題:

10:52:41.691UTC INFO akka.tcp://[email protected]:9401/user/singletonOfEvents - ClusterSingletonManager state change [Start -> Younger] 

和我的單身人士沒有啓動。

我看到「單身演員總是在具有指定角色的最老的成員上運行。」在Akka Cluster Singleton doc。但我不明白如何啓動單身人士。也許所有的單身人士都必須在第一個種子節點上實施和啓動?

+1

你怎麼能知道單身的演員是不是開始了嗎?也許你需要實現'preStart'並添加一些日誌來了解它是否正在發生。 – hveiga

+0

沒有必要明確地啓動akka提供的單身人士。 akka實現監視集羣狀態本身,並在具有爲單例指定角色的最早節點上啓動單例。從你提供的日誌消息看來,似乎單身人士實際上開始了。 要監視和記錄羣集狀態,您需要實現類似[this](http://doc.akka.io/docs/akka/2.4.17/scala/cluster-usage.html#A_Simple_Cluster_Example) –

+0

@andrey。 feoktistov我不明白如何可以在沒有需要的依賴和屬性的節點上啓動actor。在第一個節點(種子)我有簡單的成員監視器(像在給定的鏈接)和其他節點與單身實施我使用akka持久性和數據庫在單身演員 –

回答

1

如Akka文檔中所述,Cluster Singleton actor實例由每個具有指定單例角色的集羣節點上的ClusterSingletonManager actor啓動和維護。 ClusterSingletonManager在羣集的最早節點上最多保持一個單例實例,並且在任何時間點都具有指定的角色。如果最早的節點(可能是第一個種子節點)失敗,則選擇下一個最早的節點。要訪問羣集單身角色,請使用具有指定角色的所有節點上存在的ClusterSingletonProxy。

下面是啓動羣集一個示例應用程序辛格爾頓可能是什麼樣子:

object Main { 

    def workTimeout = 10.seconds 

    def main(args: Array[String]): Unit = { 
    // Validate arguments host and port from args(0) and args(1) 
    // ... 

    val role = "worker" 

    val conf = ConfigFactory.parseString(s"akka.cluster.roles=[$role]"). 
     withFallback(ConfigFactory.parseString("akka.remote.netty.tcp.hostname=" + host)). 
     withFallback(ConfigFactory.parseString("akka.remote.netty.tcp.port=" + port)). 
     withFallback(ConfigFactory.load()) 

    val system = ActorSystem("ClusterSystem", conf) 

    system.actorOf(
     ClusterSingletonManager.props(
     Master.props(workTimeout), 
     PoisonPill, 
     ClusterSingletonManagerSettings(system).withRole(role) 
    ), 
     name = "master" 
    ) 

    val singletonAgent = system.actorOf(
     ClusterSingletonProxy.props(
     singletonManagerPath = "/user/master", 
     settings = ClusterSingletonProxySettings(system).withRole(role) 
    ), 
     name = "proxy" 
    ) 

    // ... 
    } 

    // ... 
} 

object Master { 
    def props(workTimeout: FiniteDuration): Props = 
    Props(classOf[Master], workTimeout) 

    // ... 
} 

class Master(workTimeout: FiniteDuration) extends Actor { 
    import Master._ 

    // ... 
} 

羣集配置可能如下所示:

akka { 

    actor.provider = "akka.cluster.ClusterActorRefProvider" 

    remote.netty.tcp.port = 0 
    remote.netty.tcp.hostname = 127.0.0.1 

    cluster { 
    seed-nodes = [ 
     "akka.tcp://[email protected]:2552", 
     "akka.tcp://[email protected]:2552" 
    ] 

    auto-down-unreachable-after = 10s 
    } 

    // ... 
}