Жизненный цикл Scala и akka.. снова

Итак, этот вопрос связан с моим старым вопросом: Нужно ли мне повторно использовать одну и ту же Akka ActorSystem или я могу просто создавать ее каждый раз, когда она мне нужна?

Я задал вопрос о жизненном цикле актеров и понял, что у меня что-то не так, но не смог правильно сформулировать. Надеюсь теперь смогу :-).

Вот ситуация. Я хочу протестировать актеров, которые имеют зависимости от других компонентов и актеров, поэтому я начал создавать свои актеры во время начальной загрузки (я использую scalatra, но вы, тем не менее, загружаете свое приложение). Поэтому у меня есть что-то вроде этого:

trait DependencyComponent 
{
 val dependency : Dependency
}

trait ActorComponentA extends Actor with DependencyComponent {
   val actorB : ActorRef
} 

trait ActorComponentB extends Actor with DependencyComponent  

Итак, теперь я могу протестировать своих актеров, расширив трейты и предоставив фиктивные зависимости, все хорошо. И я могу загрузить свое приложение так:

Начальная загрузка

val system = ActorSystem()
val actorA = system.actorOf(Props[DefaultActorA])

class DefaultActorB extends ActorComponentB {   
   val dependency = new RealDependency() 
}

class DefaultActorA extends ActorComponentA {   
  val dependency = new RealDependency()   
  val actorB = context.actorOf(Props[DefaultActorB]).withRouter(RoundRobinRouter(nrOfInstances = 100))) 
}

Круто, я счастлив :-), теперь я могу использовать акторную систему и акторА в своем приложении, и у него есть 100 акторБ, перенаправляемых для передачи работы. Поэтому, когда актор А решает, что работа сделана, насколько я понимаю, он должен передать маршрутизируемым акторам сообщение об отключении. В этот момент, когда приходит другой запрос, актор A больше не может отправлять сообщения маршрутизатору, потому что все его акторы мертвы.

Если бы я не устанавливал это во время загрузки, то actA и его зависимости могли бы создаваться при необходимости в моем приложении. Но это очень похоже на «обновление объекта» в мире DI. Чтобы проверить, я в конечном итоге переопределял места, где были созданы актеры.

Документы Scalatra предлагают создавать моих актеров во время загрузки, поэтому я чувствую, что здесь что-то упускаю. Любая помощь приветствуется.

Здоровья, Крис.

РЕДАКТИРОВАТЬ

Я поставил +1 и @futurechimp, и @cmbaxter, поскольку они оба кажутся действительными, но немного противоречат друг другу. Так что это открытый комментарий для вас обоих.

Итак, @cmbaxter, я прав, думая, что вы предлагаете никогда не вызывать «стоп» для маршрутизируемых акторов и просто поддерживать их пул для использования ВСЕМИ запросами. И @futurechimp, вы предлагаете, чтобы сервлет создавал экземпляры актеров по запросу и убивал их в конце жизненного цикла. Верно?

Похоже, что каждый запрос будет создавать больше актеров (но избавляться от них). Если опрос будет иметь только ограниченный набор для всех запросов, и в этом случае есть потенциальное узкое место для этого подхода?

Я думаю, в основном, я спрашиваю, верны ли мои предположения, и если да, то каковы преимущества и недостатки обоих подходов?


person Owen    schedule 16.07.2013    source источник
comment
Я не уверен, в чем вопрос?   -  person sourcedelica    schedule 16.07.2013
comment
Извините, я действительно не знаю, как еще спросить об этом :-)   -  person Owen    schedule 17.07.2013
comment
Я думаю, что cmbaxter и я подходим к этому с разных точек зрения. Я говорю, что с точки зрения Scalatra нет оснований для запуска ваших Актеров в ScalatraBootstrap, а не внутри сервлета. cmbaxter, похоже, выступает за запуск Актеров без состояния во время загрузки (в ScalatraBootstrap, если вы используете Scalatra) и запуск Актеров с состоянием для каждого запроса. Это кажется мне хорошим эмпирическим правилом.   -  person futurechimp    schedule 17.07.2013


Ответы (2)


Создание экземпляра ActorSystem стоит дорого, а создание экземпляра Актера — нет. Если вы хотите только создать экземпляр вашей ActorSystem в ScalatraBootstrap, а ваших Актеров в другом месте, это должно работать нормально, если это то, что вам нужно сделать. Я поговорю с другими людьми, чтобы подтвердить это, а затем изменю документы в Руководство по Akka от Scalatra, чтобы избежать путаницы в будущем.

person futurechimp    schedule 16.07.2013

Один из вопросов, который вы должны задать себе здесь: Будут ли мои акторы иметь состояние или не иметь его? Если без сохранения состояния (и лично я предпочел бы этот подход, когда это возможно), то они могут быть «долгоживущими», и вы можете запускать их при загрузке сервера и оставлять их работающими на время жизни сервера. Когда вам нужно поговорить с ними из другого места в коде, используйте system.actorFor(String) или system.actorSelection(String) (в зависимости от того, какую версию akka вы используете), чтобы найти актера и отправить ему сообщение. Если акторы собираются с состоянием, то они, вероятно, должны быть «короткоживущими» и запускаться в ответ на индивидуальный запрос. В этом случае вы не запустите их при загрузке сервера; вы только запустите сам ActorSystem. Затем, когда поступит запрос, вы вместо этого создадите экземпляр через system.actorOf и убедитесь, что, когда работа будет выполнена, вы остановите ActorA, поскольку он является супервизором всех ActorB, а остановка A остановит все B, запущенные A.

person cmbaxter    schedule 16.07.2013