Я хотел бы создать систему распределенных почтовых ящиков на базе Akka. Когда мое приложение запускается, я хотел бы создать всех участников почтового ящика и запустить на них планировщик для получения писем с интервалами в 10 секунд. Но есть проблема, как создать этих актеров для входящих сообщений? Можно ли создать актор в кластере или получить ссылку на него, если он существует? Имя участника может быть UUID почтового ящика в базе данных, и только один субъект с определенным UUID может существовать в кластере.
Самый важный вопрос: как создать актор с именем uuid в кластере или получить ссылку на него, если он существует? Пробую такой конфиг:
actor {
provider = "akka.cluster.ClusterActorRefProvider"
}
remote {
enabled-transports = ["akka.remote.netty.tcp"]
log-remote-lifecycle-events = on
netty.tcp {
hostname = "127.0.0.1"
port = 2552
}
}
cluster {
seed-nodes = [
"akka.tcp://[email protected]:2552"]
}
И этот код для создания актера или получения ссылки на него.
def createActorIfNotExists(actorSystem: ActorSystem, name: String, props: Props)
(implicit ec: ExecutionContext): Unit = {
implicit val timeout = Timeout(5 seconds)
actorSystem.actorSelection(name).resolveOne() onComplete {
case Success(actor) =>
Logger.debug(s"Actor already created $name")
case Failure(ex) =>
Logger.debug(s"Creating actor $name")
val actor = actorSystem.actorOf(props, name)
}
}
Но приведенный выше код создает актора в локальной системе акторов, а не в кластере (следующий узел создает собственного актора, а не выбирает существующий).
Для исходящих я тоже думаю об актере диспетчера. Диспетчер будет одноэлементным кластером и будет отправлять сообщения правым дочерним элементам. Но может ли это быть узким местом?
Путь к актеру для синглтона может быть, например, / users / mailboxes, а для определенных исходящих ящиков / users / mailboxes / uuid.