Динамически добавлять/удалять маршруты к роутер-актеру

Знаете ли вы хороший способ в Akka/ Scala для добавления/удаления маршрутов к маршрутизатору Broadcaster?

Я смотрел Resizer - но не отвечал моим потребностям (я не могу понять, как явным образом попросить resizer изменить размер (добавить маршруты), и, чтобы удалить, кажется, вам нужно отправить Poison Pill актеру, который затем удаляется).

До сих пор у меня есть маршрутизатор со списком ActorRef, и я отправляю сообщения AddRoutee и RemoveRoutee....

Мое деловое дело. У меня есть актер, получающий данные из сети (через прокси), и ему нужно отправлять эти данные независимым субъектам для параллельной обработки. Благодаря графическому характеру получателей (DAG), график может развиваться во время выполнения, изменения вершин/ребер, следовательно, необходимо добавлять и удалять маршруты

Для этого должен быть более чистый способ.

Спасибо за указатели.

Пример кода, который я бы хотел обработать Akka:

 class MDActor extends Actor {
  @volatile var routees = Set[ActorRef]()

  def receive = {
    case ar: AddRoutee => routees = routees + ar.actorRef
    case rr: RemoveRoutee => routees = routees - rr.actorRef
    case msg => routees.foreach(r => r forward msg)
  }
}

Ответ 1

Всякий раз, когда вы обнаруживаете, что вам не хватает функции в маршрутизаторе, самое время начать думать в другом направлении: что не так с действующим кодексом, который вы присутствуете? Если вам не требуется маршрутизировать более нескольких миллионов сообщений в секунду (что маловероятно, учитывая ваше описание), такой актер является правильным решением. Маршрутизаторы - это очень специализированная конструкция, которая не должна использоваться в качестве замены; используйте их только тогда, когда они точно соответствуют вашим требованиям, и вы сравнили, что нормального актера недостаточно.

Ответ 2

Не уверен, что есть лучший способ, чем сохранить состояние маршрутов и построить новый маршрутизатор при каждом изменении или не использовать маршрутизатор и использовать простой актер. Я тоже недавно посмотрел на это.

Способность неизменности - Поэтому предпочтительным решением будет выбросить старый маршрутизатор и/или коллекцию и построить новый (маршрутизатор или набор/карта участников).

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

Вы можете создавать маршрутизаторы со списками участников, как показано здесь. Просто делайте это каждый раз, когда происходят изменения. (источник: документация akka - http://doc.akka.io/docs/akka/snapshot/scala/routing.html)

val actor1 = system.actorOf(Props[ExampleActor1])
val actor2 = system.actorOf(Props[ExampleActor1])
val actor3 = system.actorOf(Props[ExampleActor1])
val routees = Vector[ActorRef](actor1, actor2, actor3)
val router2 = system.actorOf(Props().withRouter(
  RoundRobinRouter(routees = routees)))

Здесь показан маршрутизатор RoundRobin, но он не отличается от использования широковещательной передачи.

Это немного более функционально, чтобы воссоздать это.