Проверьте, существует ли актер в кластере akka
Я столкнулся со сценарием, в котором мне нужно проверить, существует ли конкретный актер или нет, что можно сделать с помощью метода ActorSystem.actorSelection, указав путь к актеру.
Однако этот метод работает правильно, когда такой субъект существует на вашем локальном узле. Если система акторов образована несколькими узлами, а субъект существует на другом узле, этот метод сообщает, что субъект не существует. Если я приведу строку, которая указывает удаленную систему акторов, то этот метод работает. Но это не очень хорошая идея, чтобы указать удаленную строку актер-системы в методе actorSelection, так как узлы в кластере могут соединяться и уходить.
def getOrCreate (customerId: String, deviceId: String): Future [ActorRef] = { context.system.actorSelection (s "/ user / $ {customerId} {$ deviceId}")? Карта идентификатора (ID устройства) { case ActorIdentity(`deviceId`, None) => // создаем нового актера case ActorIdentity(`deviceId`, Some(actor)) => актер } }
Приведенный выше код прекрасно работает, когда субъект существует на локальном узле, чтобы проверить, существует ли субъект на каком-то другом узле в кластере, мне нужно было сделать что-то вроде:
def getOrCreate (customerId: String, deviceId: String): Future [ActorRef] = { context.system.actorSelection (s "akka.tcp: // Relay @ node1: 3503 / user / $ {customerId} {$ deviceId}")? Карта идентификатора (ID устройства) { case ActorIdentity(`deviceId`, None) => // создаем нового актера case ActorIdentity(`deviceId`, Some(actor)) => актер } }
Есть ли лучший способ проверить, существует ли субъект во всем akka-кластере, а не только в локальном узле?
1 ответ
Похоже, что вы хотите создать экземпляр субъекта, только если в кластере не существует субъекта с таким идентификатором. Для этого, я думаю, лучший способ - это использовать кластерное разбиение Akka и позволить Akka позаботиться о создании и распространении экземпляров. Это также позаботится о маршрутизации любых сообщений субъекту к нужному узлу, перераспределению участников при изменении размера кластера и т. Д.