Акка - Сколько экземпляров актера вы должны создать? - PullRequest
62 голосов
/ 13 ноября 2011

Я новичок в инфраструктуре Akka и создаю серверное приложение HTTP поверх Netty + Akka.

Моя идея на данный момент - создать актера для каждого типа запроса. Например. У меня был бы актер для POST в / my-resource и другой актер для GET в /my-resource.

Где я запутался, как я должен идти о создании актера? Должен ли я:

  1. Создать нового актера для каждого запроса (я имею в виду, что для каждого запроса я должен делать TypedActor.newInstance () соответствующего актера)? Сколько стоит создать нового актера?

  2. Создать один экземпляр каждого субъекта при запуске сервера и использовать этот экземпляр субъекта для каждого запроса? Я читал, что актер может обрабатывать только одно сообщение за раз, поэтому разве это не может быть бутылочным горлышком?

  3. Что-нибудь еще?

Спасибо за любые отзывы.

Ответы [ 5 ]

33 голосов
/ 13 ноября 2011

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

В вашем случае это может быть только один субъект, если my-resource - это отдельный объект, и вы хотите обрабатывать каждый запрос последовательно - это легко гарантирует, что вы возвращаете согласованные состояния только между модификациями.* Если (более вероятно) вы управляете несколькими ресурсами, один субъект на экземпляр ресурса обычно идеален, если вы не столкнетесь со многими тысячами ресурсов.Хотя вы также можете запускать актеров по запросу, вы получите странный дизайн, если не будете думать о состоянии, к которому обращаются эти запросы - например, если вы просто создадите одного актера на запрос POST, вы будете беспокоитьсякак не дать им одновременно изменять один и тот же ресурс, что ясно указывает на то, что вы неправильно определили своих актеров.

У меня обычно есть довольно тривиальные актеры запроса / ответа, основная цель которых состоит в том, чтобы абстрагировать связь с внешними системами.Их общение с субъектами «экземпляра» обычно ограничивается одной парой запрос / ответ для выполнения фактического действия.

24 голосов
/ 06 декабря 2013

Варианты 1) или 2) имеют свои недостатки. Итак, давайте использовать опции 3) Маршрутизация (Акка 2.0 +)

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

Akka предоставляет различные реализации маршрутизатора с различной логикой для маршрутизации сообщения (например, SmallestMailboxPool или RoundRobinPool).

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

//This will create 5 instances of the actor ExampleActor
//managed and supervised by a RoundRobinRouter
ActorRef roundRobinRouter = getContext().actorOf(
Props.create(ExampleActor.class).withRouter(new RoundRobinRouter(5)),"router");

Эта процедура хорошо объяснена в этом блоге .

24 голосов
/ 07 сентября 2012

Если вы используете Akka, вы можете создать актера для каждого запроса.Akka очень невелик в ресурсах, и вы можете создавать буквально миллионы актеров в обычной куче JVM.Кроме того, они будут использовать процессор / стек / потоки только тогда, когда они действительно что-то делают.

Год назад я провел сравнение между потреблением ресурсов в стандартах на основе потоков и событий.актеры.А Akka даже лучше, чем база событий.

Одна из важных особенностей Akka, на мой взгляд, заключается в том, что она позволяет проектировать вашу систему как «одного участника на использование», гдеболее ранние системы акторов часто заставляли вас «использовать только актеров для общих служб» из-за перерасхода ресурсов.

Я бы порекомендовал перейти к варианту 1.

9 голосов
/ 13 ноября 2011
  1. Это вполне разумный вариант, но его пригодность зависит от особенностей обработки вашего запроса.

  2. Да, конечно, может.

  3. Во многих случаях лучше всего было бы, чтобы один субъект отвечал на каждый запрос (или, возможно, один субъект на тип запроса), но единственное, что делает этот субъект, - это передает задачу другому. актер (или порождает Future), который фактически сделает эту работу.

4 голосов
/ 22 мая 2012

Для расширения обработки последовательных запросов добавьте главного актера ( Супервизор ), который, в свою очередь, делегирует рабочим актерам ( Дети ) ( круговой режим).).

...