Нужно ли мне повторно использовать ту же Akka ActorSystem, или я могу просто создать ее каждый раз, когда мне это нужно?
Для Akka 2.x требуется множество команд для ссылки ActorSystem
. Итак, чтобы создать экземпляр актера MyActor
, вы можете сказать:
val system = ActorSystem()
val myActor = system.actorOf(Props[MyActor])
Из-за частых потребностей в ActorSystem
: многие примеры кода опускают создание из кода и предполагают, что читатель знает, откуда появилась переменная system
.
Если ваш код создает участников в разных местах, вы можете дублировать этот код, возможно, создавая дополнительные экземпляры ActorSystem
, или вы можете попробовать использовать один и тот же экземпляр ActorSystem
, обратившись к некоторому глобальному или передав ActorSystem
вокруг.
Документация Akka предоставляет общий обзор систем участников под заголовком "Системы актеров" и документация класса ActorSystem
. Но ни одна из них не помогает в объяснении того, почему пользователь Акки не может просто полагаться на Акку, чтобы управлять этим под капотом.
Вопрос (ы)
-
Каковы последствия совместного использования одного и того же объекта ActorSystem
или создания нового?
-
Каковы лучшие практики здесь? Прохождение вокруг ActorSystem
все время кажется удивительно тяжелым.
-
Некоторые примеры дают имя ActorSystem
a: ActorSystem("MySystem")
другие просто вызывают ActorSystem()
. Какая разница, и что, если вы используете одно и то же имя дважды?
-
Требуется ли akka-testkit
, чтобы вы делили общий ActorSystem
с тем, который вы передаете конструктору TestKit
?
Ответы
Ответ 1
Создание ActorSystem очень дорого, поэтому вы хотите избежать создания нового каждый раз, когда вам это нужно. Кроме того, ваши актеры должны работать в одной системе ActorSystem, если у них нет веских оснований. Имя ActorSystem также является частью пути к действующим в нем субъектам. Например. если вы создадите актера в системе с именем MySystem
, он будет иметь путь, подобный akka://MySystem/user/$a
. Если вы находитесь в контексте актера, у вас всегда есть ссылка на ActorSystem. В Актере вы можете позвонить context.system
. Я не знаю, что ожидает ака-тестчик, но вы можете взглянуть на тесты akka.
Итак, чтобы подвести итог, вы всегда должны использовать одну и ту же систему, если нет веской причины не делать этого.
Ответ 2
Вот некоторые материалы, которые могут быть полезны для понимания "Почему документ всегда предлагает использовать одну ActorSystem для одного логического приложения":
-
Самой тяжелой частью системы ActorSystem является диспетчер. Каждая система ActorSystem имеет хотя бы одну. Диспетчер - это двигатель, который заставляет актеров работать. Для выполнения работы ему нужны потоки (обычно полученные из пула потоков). Диспетчер по умолчанию использует пул потоков fork-join с не менее чем 8 потоками.
-
Существуют общие объекты, такие как актеры-хранители, поток событий, планировщик и т.д. Некоторые из них находятся в пользовательском пространстве, некоторые из них являются внутренними. Все они должны быть созданы и начаты.
-
Одна система ActorSystem с одним пулом потоков настраивается на количество ядер, чтобы обеспечить наилучшие результаты в большинстве случаев.
-
В документе упоминается логическое приложение, я предпочитаю рассматривать блокирующее или неблокирующее приложение. Согласно конфигурации диспетчера, одна система ActorSystem предназначена для одной конфигурации. Если приложение предназначено для одних и тех же логик, одной системы ActorSystem должно быть достаточно.
Вот обсуждение, если у вас есть время, вы можете прочитать его. Они много обсуждают, ActorSystem, локальные или удаленные и т.д.