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