如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
}
// ...
}
你怎麼能知道單身的演員是不是開始了嗎?也許你需要實現'preStart'並添加一些日誌來了解它是否正在發生。 – hveiga
沒有必要明確地啓動akka提供的單身人士。 akka實現監視集羣狀態本身,並在具有爲單例指定角色的最早節點上啓動單例。從你提供的日誌消息看來,似乎單身人士實際上開始了。 要監視和記錄羣集狀態,您需要實現類似[this](http://doc.akka.io/docs/akka/2.4.17/scala/cluster-usage.html#A_Simple_Cluster_Example) –
@andrey。 feoktistov我不明白如何可以在沒有需要的依賴和屬性的節點上啓動actor。在第一個節點(種子)我有簡單的成員監視器(像在給定的鏈接)和其他節點與單身實施我使用akka持久性和數據庫在單身演員 –