Нужно ли мне повторно использовать ту же 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, локальные или удаленные и т.д.