単一障害点を持たないシステムを作成したいと考えています。 私はルータがそれを行うためのツールであるという印象を受けましたが、期待通りにルータが動作するかどうかはわかりません。 これは私のプログラムのエントリポイントである:(ので、ルータはリモート・ノードにTestActor
コードを展開できます)Akka単一障害点
object Main extends App{
val system = ActorSystem("mySys", ConfigFactory.load("application"))
val router = system.actorOf(
ClusterRouterPool(RoundRobinPool(0), ClusterRouterPoolSettings(
totalInstances = 2, maxInstancesPerNode = 1,
allowLocalRoutees = false, useRole = Some("testActor"))).props(Props[TestActor]),
name = "testActors")
}
そして、これがリモートActorSystem
を実行するためのコードです:
object TestActor extends App{
val system = ActorSystem("mySys", ConfigFactory.load("application").getConfig("testactor1"))
case object PrintRouterPath
}
私はこれを2回、testactor1
で1回、testactor2
で1回実行しています。
TestActor
コード:
class TestActor extends Actor with ActorLogging{
implicit val ExecutionContext = context.dispatcher
context.system.scheduler.schedule(10000 milliseconds, 30000 milliseconds,self, PrintRouterPath)
override def receive: Receive = {
case PrintRouterPath =>
log.info(s"router is on path ${context.parent}")
}
}
そしてapplication.conf
akka{
actor {
provider = "akka.cluster.ClusterActorRefProvider"
}
remote {
log-remote-lifecycle-events = off
netty.tcp {
hostname = "127.0.0.1"
port = 2552
}
}
cluster {
seed-nodes = [
"akka.tcp://[email protected]:2552"
"akka.tcp://[email protected]:2553"
"akka.tcp://[email protected]:2554"]
auto-down-unreachable-after = 20s
}
}
testactor1{
akka{
actor {
provider = "akka.cluster.ClusterActorRefProvider"
}
remote {
log-remote-lifecycle-events = off
netty.tcp {
hostname = "127.0.0.1"
port = 2554
}
}
cluster {
roles.1 = "testActor"
seed-nodes = [
"akka.tcp://[email protected]:2552"
"akka.tcp://[email protected]:2553"
"akka.tcp://[email protected]:2554"]
auto-down-unreachable-after = 20s
}
}
}
testactor2{
akka{
actor {
provider = "akka.cluster.ClusterActorRefProvider"
}
remote {
log-remote-lifecycle-events = off
netty.tcp {
hostname = "127.0.0.1"
port = 2553
}
}
cluster {
roles.1 = "testActor"
seed-nodes = [
"akka.tcp://[email protected]:2552"
"akka.tcp://[email protected]:2553"
"akka.tcp://[email protected]:2554"]
auto-down-unreachable-after = 20s
}
}
}
今問題となっているルータを開始したプロセスが殺されたとき、TestActor
のコードを実行している俳優、 (スケジューラーが送信するメッセージ)を受信していない場合、クラスター内の別のシードノードにルーターがデプロイされ、アクターが回復することが予想されます。これは可能ですか?またはこのフローを実装し、単一の障害点を持たない他の方法がありますか?
1)私はあなたが各ルータ上でまったく同じ2つのインスタンスを持っている(グループ)それらの一つ一つにルータを起動することをお勧め、その後testActorを実行している2つのノードを持って言うことができます役立ちます願っています。今はどのようにルータを使用しますか?私はそれを使用する目的は何ですか?ブロードキャストメッセージをルートに送信したい場合は、ルータを含むノードの1つにメッセージを送信するか、そのノードを使用できないか、またはすべてのノードに送信してから、複数のメッセージ処理を行います。何か不足していますか? 2) 'ClusterSingletonManager'を使うと' TestActor'で2人のアクターを起動できないでしょうか? –