我想要建立一个系统,它不会有一个单一的故障点。我当时的印象是路由器是这样做的工具,但我不确定它是否如我所期望的那样工作。这是我的项目的切入点:
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的代码(因此路由器可以将TestActor代码部署到远程节点):
object TestActor extends App{
val system = ActorSystem("mySys", ConfigFactory.load("application").getConfig("testactor1"))
case object PrintRouterPath
}我要运行这两次,一次用testactor1,一次用testactor2。
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://mySys@127.0.0.1:2552"
"akka.tcp://mySys@127.0.0.1:2553"
"akka.tcp://mySys@127.0.0.1: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://mySys@127.0.0.1:2552"
"akka.tcp://mySys@127.0.0.1:2553"
"akka.tcp://mySys@127.0.0.1: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://mySys@127.0.0.1:2552"
"akka.tcp://mySys@127.0.0.1:2553"
"akka.tcp://mySys@127.0.0.1:2554"]
auto-down-unreachable-after = 20s
}
}
}现在的问题是,当启动路由器的进程被杀死时,运行TestActor代码的参与者没有接收到任何消息(调度程序发送的消息),我希望路由器将部署在集群中的另一个种子节点上,并且将恢复参与者。这个是可能的吗?或者有没有其他的方法来实现这个流程,而没有一个单一的失败点?
发布于 2017-01-26 16:34:04
我认为,通过只在一个节点上部署router,您将设置一个主从集群,其中主节点定义为单个故障点。
据我所知(查看文档),路由器可以感知集群,因为它可以在集群中的节点上部署(池模式)或查找(组模式)路由器。路由器本身不会通过在集群中其他地方生成而对失败作出反应。
我相信你有两个选择:
ClusterSingletonManager)来实现的。这位演员的目的是想弄清楚选择的主人是否需要重生,以及在哪里。在集群感知路由器的情况下,所有这些逻辑都不适用于您设置的路由器。您可以在此活化剂样品中找到多个集群设置的示例。
发布于 2017-01-30 20:34:31
我测试了两种方法,第一种是在ClusterRouterPool中使用您的代码,正如您所说的,当启动路由器的进程被终止时,TestActor没有收到更多的消息。在阅读文档和测试时,如果您更改了application.conf:
`auto-down-unreachable-after = 20s` 为此
`auto-down-unreachable-after = off`TestActor一直在接收消息,尽管在日志中出现了以下消息(对不起,我不知道如何将日志放在这里):
警告mySys-akka.emote.Default- remote -dispatcher-5关联远程系统akka.tcp://mySys@127.0.0.1:2552已失败,地址现在关闭为5000 ms。原因:[联系失败与akka.tcp://mySys@127.0.0.1:2552]:连接被拒绝: akka.tcp://mySys@127.0.0.1:2554/remote/akka.tcp/mySys@127.0.0.1:2552/user/testActors/c1 01/30/2017 :20:20:29.860 Actorakka.tcp://mySys@127.0.0.1:2552/user/testActors路由器在路径上#-1120251475 01/30/2017 17:20:32.016
在重新启动MainApp的情况下,日志正常工作,没有警告或错误。
MainApp日志:
信息mySys-akka.actor.default-2群集节点akka.tcp://mySys@127.0.0.1:2552 -欢迎来自akka.tcp://mySys@127.0.0.1:2554
TestActor日志:
信息[ 01/30/2017 17:23:21.958 akka.cluster.Cluster(akka://mySys)群集Node akka.tcp://mySys@127.0.0.1:2554 -现有成员的新化身(地址= akka.tcp://mySys@127.0.0.1:2552,status = Up)正在尝试加入。现有成员将从集群中删除,然后允许新成员加入。信息mySys-akka.actor.Default-14群集节点akka.tcp://mySys@127.0.0.1:2554 -标记不可到达的节点akka.tcp://mySys@127.0.0.1:2552 as Down 01/30/2017 17:23:22.454 akka.cluster.Cluster(akka://mySys)群集Nodeakka.tcp://mySys@127.0.0.1:2554-领导人可以再次执行其职责-mySys-akka.actor.defaulcher-2集群节点阿克卡。tcp://mySys@127.0.0.1:2554 -领导人正在删除无法到达的节点akka.tcp://mySys@127.0.0.1:2552 01/30/2017 17:23:32.728 akka.cluster.Cluster(akka://mySys)群集节点akka.tcp://mySys@127.0.0.1:2554 - node akka.tcp://mySys@127.0.0.1:2552正在加入,角色01/30/2017 17:23:33.457 akka.cluster.Cluster(akka://mySys)集群节点akka.tcp://mySys@127.0.0.1:2554 -领导人正在将节点akka.tcp://mySys@127.0.0.1:2552移动到01/30/2017 :23:37.925 akka.tcp://mySys@127.0.0.1:2554/remote/akka.tcp/mySys@127.0.0.1:2552/user/testActors/Actorakka.tcp://mySys@127.0.0.1:2552/user/testActors#-630150507路径上的c1路由器
另一种方法是使用ClusterRouterGroup,因为路由器是在集群的节点之间共享的。
主应用程序
object Main extends App {
val system = ActorSystem("mySys", ConfigFactory.load("application.conf"))
val routerGroup = system.actorOf(
ClusterRouterGroup(RoundRobinGroup(Nil), ClusterRouterGroupSettings(
totalInstances = 2, routeesPaths = List("/user/testActor"),
allowLocalRoutees = false, useRole = Some("testActor"))).props(),
name = "testActors")
}必须在每个远程节点中启动TestActor。
object TestActor extends App{
val system = ActorSystem("mySys", ConfigFactory.load("application").getConfig("testactor1"))
system.actorOf(Props[TestActor],"testActor")
case object PrintRouterPath
}鲁特斯
路由器在启动参与者系统时应尽早启动路由器,因为一旦成员状态更改为“Up”,路由器就会尝试使用它们。
我希望它能帮到你
https://stackoverflow.com/questions/41783548
复制相似问题