Проходит ли ActorRef другим актерам хорошо или плохо?
Я пытаюсь выяснить, не связано ли мое использование передачи Akka ActorRef
другим актерам не анти-шаблон.
У меня есть несколько актеров в моей системе. Некоторые из них долговечны (restClientRouter
, publisher
), а некоторые умирают после этого, они выполнили работу (geoActor
). Недолговечные актеры должны отправлять сообщения живым актерам и поэтому нуждаются в их ActorRef
s.
//router for a bunch of other actors
val restClientRouter = createRouter(context.system)
//publishers messages to an output message queue
val publisher: ActorRef = context.actorOf(Props(new PublisherActor(host, channel)), name = "pub-actor")
//this actor send a message to the restClientRouter and then sends the response
//to the publisher
val geoActor = context.actorOf(Props(new GeoInferenceActor(restClientRouter, publisher)), name = "geo-inference-actor")
Как вы можете видеть, я передаю ActorRefs (restClientRouter
и publisher
) конструктору GeoInferenceActor
. Это хорошо или нет? Есть ли лучший способ сделать это?
Ответы
Ответ 1
Есть несколько хороших способов "представить" актерские ссылки на экземпляры актеров, которые в них нуждаются.
1) Создайте актера с refs, в котором он нуждается, как конструктор args (что вы делаете)
2) Передайте необходимые refs с сообщением после создания экземпляра
Ваше решение вполне приемлемо и даже предложено Роланд Куном, Tech Lead для Akka, в этом сообщении:
Поиск актера Аккой или зависимость от него
Ответ 2
Это совершенно справедливо, как указано в документации Akka API:
ActorRefs может свободно делиться между участниками посредством передачи сообщений.
В вашем случае вы передаете их конструкторам, которые абсолютно отлично и как это должно быть.