Я хочу создать систему, в которой не будет единой точки отказа. У меня создалось впечатление, что маршрутизаторы - это инструмент для этого, но я не уверен, что он работает так, как я ожидал. Это точка входа моей программы: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
(так маршрутизатора может развернуть TestActor
код на удаленные узлы):
object TestActor extends App{
val system = ActorSystem("mySys", ConfigFactory.load("application").getConfig("testactor1"))
case object PrintRouterPath
}
I 'пробегает это дважды, один раз с 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://[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) позволяет сказать, что у меня есть два узла под управлением testActor то предлагаю начать маршрутизатор на каждом из них (группа, чтобы иметь одни и те же два экземпляра на каждом маршрутизаторе). теперь как я буду использовать маршрутизатор? Я имею в виду, какова будет его цель? если я хочу отправить широковещательное сообщение на маршруты, я либо отправлю сообщение на один из узлов, содержащих маршрутизатор (и этот узел может быть недоступен), либо отправить их всем, а затем получить несколько сообщений. Я что-то упускаю? 2) Если я использую 'ClusterSingletonManager', это не значит, что я не могу запустить двух актеров с помощью TestActor? –