Когда дело доходит до создания веб-службы REST с 60+ API на akka http. Как я могу выбрать, что мне следует использовать: потоки акка или актеры акка? В своем сообщении Джос показывает два способа создания API на akka http, но не показывает, когда я должен выбрать один из них.
akka http: потоки Akka против актеров для создания сервиса отдыха
Ответы (2)
Это сложный вопрос. Очевидно, работают оба подхода. Так что в определенной степени это вопрос вкуса / знакомства. Так что все, что будет дальше, - это мое личное мнение.
По возможности я предпочитаю использовать akka-stream из-за его более высокого уровня и безопасности типов. Но насколько это жизнеспособный подход, во многом зависит от задачи REST API.
Акка-поток
Если ваш REST API - это служба, например отвечает на вопросы на основе внешних данных (например, API курса обмена валют), предпочтительно реализовать его с помощью akka-stream.
Другой пример, где предпочтительнее akka-stream, - это какой-то интерфейс базы данных, где задача REST API - анализировать параметры запроса, переводить их в запрос БД, выполнять запрос и переводить результат в соответствии с запрошенным типом содержимого. пользователем. В обоих случаях поток данных легко отображается на примитивы akka-stream.
Актеры
Примером, когда использование акторов было бы предпочтительнее, может быть то, что ваш API позволяет запрашивать и обновлять ряд постоянных акторов в кластере. В этом случае может быть предпочтительнее либо решение на основе чистого актора, либо смешанное решение (анализ параметров запроса и перевод результатов с использованием akka-stream, все остальное с использованием акторов).
Другой пример, когда решение на основе акторов может быть предпочтительнее, - это если у вас есть REST API для длительных запросов (например, веб-сокетов) и вы хотите развернуть конвейер обработки самого REST API в кластере. Я не думаю, что что-то подобное сейчас возможно вообще с использованием akka-stream.
Резюме
Итак, чтобы подвести итог: посмотрите на поток данных каждого API и посмотрите, четко ли он отображается на примитивы, предлагаемые akka-stream. Если это так, реализуйте это с помощью akka-stream. В противном случае реализуйте с помощью акторов или смешанного решения.
ask
шаблон, а не на tell
, если вы хотите отправить свой запрос вниз по иерархии акторов. Шаблон «актер на запрос» полезен, учитывая незначительную стоимость нового актера. Я также вижу, что поток очень хорошо работает в качестве агрегатора для базовых вспомогательных сервисов, чтобы легко группировать вспомогательные API. Это особенно важно при разработке для мобильных устройств, где # запросов должно быть минимальным. Что вы думаете?
- person Mutaz; 05.11.2015
Не забывайте о будущем!
Одно дополнение, которое я хотел бы сделать к прекрасному ответу Рудигера Клаена, - это также рассмотреть вариант использования _ 1_. Компонентность Futures и управление ресурсами ExecutionContext
делают Futures идеальным для многих, если не для большинства, ситуаций.
Есть отличная запись в блоге, в которой описывается, когда будущее лучше, чем актеры. Кроме того, обратное давление, обеспечиваемое Streams, сопровождается довольно значительными накладными расходами < / а>.
Тот факт, что вы попали в кроличью нору, используя akka-http, не означает, что весь параллелизм в вашем обработчике запросов должен быть ограничен Акторами или Потоками.
Маршрут
Route
по своей сути размещает фьючерсы на определение типа:
type Route = (RequestContext) ⇒ Future[RouteResult]
Поэтому вы можете встроить будущее прямо в свой маршрут, используя только функции и фьючерсы, без директив:
val requestHandler : RequestContext => HttpResponse = ???
val route : Route =
(requestContext) => Future(requestHandler(requestContext)) map RouteResult.Complete
onComplete Directive
_ 6_ Директива позволяет вам« развернуть »будущее в вашем маршруте:
val route =
get {
val future : Future[HttpResponse] = ???
onComplete(future) {
case Success(httpResponse) => complete(httpResponse)
case Failure(exception) => complete(InternalServerError -> exception.toString)
}
}