2014-01-22 6 views
4

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

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

Что лучше?

Я использую Акку 2.3

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

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

+0

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

ответ

2

Вы можете получить удаленный адрес для вашего ActorSystem через Extension (см. Programmatically obtain ephemeral port with Akka). Таким образом, вы можете сравнивать адреса вместо строк, немного менее взломанные.

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

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

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

Смежные вопросы