Проверить, был ли отправитель-субъект локальным или удаленным

Мне нужно определить, был ли отправитель сообщения одним из локальных или удаленных субъектов в кластере Akka. В настоящее время я нашел единственный способ сделать это:

def isLocal(sndr: ActorRef) = sndr.path.address.toString == context.system.toString

Что лучше?

Я использую Akka 2.3

Обновление: чтобы объяснить, почему я хочу это сделать, на случай, если есть способ полностью избежать проблемы.

На каждом узле маршрутизатор управляет несколькими участниками, выполняющими работу. Рабочие акторы отправляют результаты обратно локальному главному актору, и им назначаются новые задания через ссылку отправителя. Ведущие субъекты также периодически отправляют результаты ведущим субъектам других узлов, гарантируя, что данные случайным образом «перемешиваются» между мастерами на разных узлах. В случае данных, поступающих от удаленного субъекта, принимающий мастер не должен пытаться выделить новую работу. По сути, это реализация метода островов со смешиванием.


person Pengin    schedule 22.01.2014    source источник
comment
Зачем тебе это нужно знать? Одним из ключевых аспектов Akka является прозрачность местоположения, я бы сделал шаг назад и спросил себя, почему вы это нарушаете.   -  person Ryan    schedule 22.01.2014


Ответы (2)


Вы можете получить удаленный адрес для своего ActorSystem через Extension (см. Программно получить временный порт с помощью Akka). Таким образом, вы могли сравнивать адреса вместо строк, что было немного менее хитроумно.

Обращаясь к точке зрения Райана, другой подход заключался бы в том, чтобы заключить сообщение о результатах в другое сообщение. Когда вы сопоставите обертку, вы узнаете, что она не от местного работника, а затем вы можете развернуть ее и сделать все, что вам нужно, с результатами.

def receive = {
  case NonLocalResults(results) => // do something with non-local results
  case Results(...)             => // do something with local results
  ...
}
person sourcedelica    schedule 22.01.2014

Вы также можете проверить host и protocol Sender. Локальные субъекты будут иметь empty хост и akka в качестве протокола, удаленные субъекты, с другой стороны, будут иметь действительные hostname/ip и akka.tcp в качестве протокола.

person illegal-immigrant    schedule 15.03.2017