Акка - Сколько экземпляров актера вы должны создать?
Я новичок в инфраструктуре Akka и создаю приложение HTTP-сервера поверх Netty + Akka.
Моя идея пока состоит в том, чтобы создать актера для каждого типа запроса. Например, у меня был бы актер для POST в /my-resource и другой актер для GET в /my-resource.
Где я запутался, так это то, как я должен заниматься созданием актеров? Нужно ли мне:
Создать нового актера для каждого запроса (под этим я подразумеваю, что для каждого запроса я должен делать TypedActor.newInstance() соответствующего актера)? Сколько стоит создать нового актера?
Создать один экземпляр каждого субъекта на сервере при запуске и использовать этот экземпляр субъекта для каждого запроса? Я читал, что актер может обрабатывать только одно сообщение за раз, поэтому разве это не может быть бутылочным горлышком?
Сделать что-то еще?
Спасибо за любые отзывы.
5 ответов
Ну, вы создаете Actor для каждого экземпляра изменяемого состояния, которым хотите управлять.
В вашем случае это может быть только один актер, если my-resource
это отдельный объект, и вы хотите обрабатывать каждый запрос последовательно - это легко гарантирует, что вы возвращаете только согласованные состояния между модификациями.
Если (более вероятно) вы управляете несколькими ресурсами, один субъект на экземпляр ресурса обычно идеален, если вы не столкнетесь со многими тысячами ресурсов. Хотя вы также можете запускать актеров по запросу, вы получите странный дизайн, если не будете думать о состоянии, к которому обращаются эти запросы - например, если вы просто создадите одного актера на запрос POST, вы будете беспокоиться как не дать им одновременно изменять один и тот же ресурс, что ясно указывает на то, что вы неправильно определили своих актеров.
У меня обычно есть довольно тривиальные актеры запроса / ответа, основная цель которых состоит в том, чтобы абстрагировать связь с внешними системами. Их общение с субъектами "экземпляра" обычно ограничивается одной парой запрос / ответ для выполнения фактического действия.
Если вы используете Akka, вы можете создать актера для каждого запроса. Akka очень невелик в ресурсах, и вы можете создавать буквально миллионы актеров в довольно обычной куче JVM. Кроме того, они будут использовать процессор / стек / потоки только тогда, когда они действительно что-то делают.
Год назад я провел сравнение между потреблением ресурсов стандартными субъектами на основе потоков и событий. А Акка даже лучше, чем Event-Base.
По моему мнению, одним из важных моментов Akka является то, что он позволяет вам спроектировать вашу систему как "одного субъекта на использование", тогда как более ранние системы участников часто заставляли вас "использовать только участников для общих служб" из-за нехватки ресурсов.
Я бы порекомендовал вам перейти на вариант 1.
Варианты 1) или 2) имеют оба своих недостатка. Итак, давайте использовать варианты 3) Маршрутизация (Akka 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");
Эта процедура хорошо объяснена в этом блоге.
Это вполне разумный вариант, но подходит ли он, зависит от особенностей обработки вашего запроса.
Да, конечно, может.
Во многих случаях лучше всего было бы, чтобы один актер отвечал на каждый запрос (или, возможно, один актер на тип запроса), но единственное, что этот актер делает, - перенаправляет задачу другому актору (или порождает
Future
) который на самом деле сделает работу.
Для расширения обработки последовательных запросов добавьте главного актера ( супервизора), который, в свою очередь, будет делегировать рабочим актерам ( детям) ( круговой режим).