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


Акка 2.X требует много команд для ссылки ActorSystem. Итак, чтобы создать экземпляр актера MyActor вы можете сказать:

val system = ActorSystem()
val myActor = system.actorOf(Props[MyActor])

из-за частой необходимости ActorSystem: многие примеры кода опускают создание из кода и предполагают, что читатель знает, где a system переменная пришла из.

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

документация Akka предоставляет общий обзор систем субъектов под заголовком "актерские системы", и есть документация ActorSystem класс. Но ни один из них не очень помогает объяснить, почему пользователь Akka не может просто полагаться на Akka для управления этим под капотом.

вопрос(ы)

  • каковы последствия совместного использования одного и того же ActorSystem объект или создание нового каждый раз?

  • каковы лучшие практики здесь? Проходя вокруг ActorSystem все время кажется удивительно жесткая.

  • некоторые примеры дают ActorSystem название: ActorSystem("MySystem") другие просто называют ActorSystem(). Какая разница, и что делать, если вы используете то же самое имя дважды?

  • тут akka-testkit требуйте, чтобы вы разделяли общее ActorSystem с тем, который вы передаете в TestKit конструктор?

2 61

2 ответа:

создание системы ActorSystem очень дорого, поэтому вы хотите, чтобы избежать создания нового каждый раз, когда вам это нужно. Также ваши актеры должны работать в той же системе актеров, если нет веской причины для них не делать этого. Имя системы ActorSystem также является частью пути к актерам, которые работают в ней. Например, если вы создаете субъекта в системе с именем MySystem Он будет иметь путь типа akka://MySystem/user/$a. Если вы находитесь в контексте актора, у вас всегда есть ссылка на систему акторов. В актера можно позвонить context.system. Я не знаю, что ожидает akka-testkit, но вы можете взглянуть на тесты akka.

Итак, чтобы подвести итог, вы всегда должны использовать одну и ту же систему, если нет веской причины не делать этого.

вот некоторые материалы, которые могут быть полезны для понимания "почему документ всегда предлагает использовать одну систему ActorSystem для одного логического приложения":

  1. самая тяжелая часть Акторсистемы-это диспетчер. Каждая система акторов имеет по крайней мере один. Диспетчер-это двигатель, который заставляет актеров работать. Чтобы выполнить запуск, ему нужны потоки (обычно полученные из пула потоков). Диспетчер по умолчанию использует пул потоков fork-join с не менее чем 8 потоками.

  2. есть общие объекты, такие как guardian actors, поток событий, планировщик и т. д. Некоторые из них находятся в пользовательском пространстве, некоторые являются внутренними. Все они должны быть созданы и начали.

  3. одна система ActorSystem с одним пулом потоков настраивается на количество ядер, которые должны давать наилучшие результаты в большинстве случаев.

  4. здесь документ упоминает логическое приложение, я предпочитаю рассматривать блокировку или неблокирующее приложение. Согласно конфигурации диспетчера, одна система ActorSystem предназначена для одной конфигурации. Если приложение предназначено для одной и той же логики, одной системы акторов должно быть достаточно.

здесь обсуждение , если у вас есть время, вы можете прочитать его. Они много обсуждают, акторы Системные, локальные или удаленные и т.д.