Когда создавать актера Akka

#scala #parallel-processing #akka #akka-actor

#scala #параллельная обработка #akka #akka-актер

Вопрос:

У меня есть служба REST, которая обслуживает только один запрос POST. Я хочу использовать актера для обработки запроса. Однако я не знаю, должен ли я создать одного актера и выводить все запросы, используя этого актера, или я должен создавать актера каждый раз, когда получаю запрос. Каковы плюсы и минусы этих вариантов. Кроме того, как происходит параллельное выполнение, когда я создаю одного актера и использую этого актера для обработки всех моих запросов. Это, безусловно, выглядит как последовательное выполнение. Я бы тоже хотел это понять.

Ответ №1:

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

Вот почему это сказано

Один актер — это не актер.

Создайте актера-менеджера, который управляет другими актерами. Поскольку актеры довольно дешевы, вы можете без проблем создавать одного актера для каждого запроса. Выполняйте взаимодействия с БД и другие тяжелые вычисления с использованием future и прямых результатов future для обработки запросов актора с использованием pipeTo шаблона.

Используйте актеров только для разделения и распределения работы и используйте фьючерсы для выполнения работы, требующей больших вычислительных ресурсов.

Ответ №2:

Я бы создал актера по запросу и использовал шаблон «сообщить», чтобы делегировать работу вновь созданному актеру. Если используемая вами платформа REST поддерживает выполнение запроса от другого актера (Spray, Akka-HTTP поддерживает), то вы можете выполнить запрос от этого нового актера. Таким образом, ваш субъект обработки запросов может свободно обрабатывать следующий запрос.

Я нахожу это замечательным ресурсом, который объясняет плюсы и минусы ask amp; tell и для каждого участника запроса. Это может быть полезно для вас.

Ответ №3:

Я согласен с тем, что сказал @pamu. Актеры дешевы. Но помните, что если когда-либо вы собираетесь использовать одноэлементного актера, не делайте его с сохранением состояния, это вызовет проблемы.

И если вы собираетесь использовать Futures для выполнения интенсивной работы (что вам следует делать). Убедитесь, что вы указали им конкретный ExecutionContext / Dispatcher. Использование глобального диспетчера или ExecutionContext не подходит.

Или в каждом имеющемся у вас API создайте определенного диспетчера для управления числом актеров, которые будут работать с такого рода конечной точкой / api.

Например, у вас есть «/ get / transactions»

укажите диспетчер, который будет порождать только это число потоков. Для этого api.

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