Как реализовать веб-службу REST с помощью Akka?

Я намерен реализовать чистый веб-API на основе REST на базе Akka. Я не уверен в использовании спрея. Я бы подумал об использовании Scalatra, если это хорошо. В основном я заинтересован в использовании преимуществ параллелизма модели Scala Actor. Я не хочу, чтобы контейнер Servlet мешал этому процессу.

Какие могут быть другие варианты?

Обновление 1: какой интерфейс лучше подходит для реализации REST на основе бэкэнда Akka? - Спрей, Scalatra или Dropwizard или любой другой?


person Kamesh Rao Yeduvakula    schedule 12.07.2011    source источник


Ответы (6)


В отношении Akka важно понимать, что это не среда «все или ничего». Вы можете в значительной степени смешивать и сочетать различные библиотеки, чтобы составить систему, которая имеет смысл для вас. Например, я без проблем писал приложения, использующие Dropwizard, перед серверной частью, использующей Akka. Я также сделал то же самое с Clothesline (реализованным в Clojure, но с оболочка Scala). Позже на этой неделе я надеюсь поэкспериментировать с использованием Unfiltered из реализация веб-сокета, чтобы сидеть перед Akka и каналом RabbitMQ для передачи данных почти в реальном времени в клиентские браузеры - я специально упоминаю этот пример, потому что нефильтрованный веб-сокет impl находится поверх Netty, а не контейнера сервлетов).

Обновление: поскольку несколько лет назад я написал этот ответ, я начал использовать Spray исключительно для разработки RESTful с Akka. . Хотя можно использовать практически любую библиотеку JVM REST, Spray очень естественно вписывается в модель Akka, основанную на акторах, и библиотека явно достигла уровня зрелости, когда ее можно легко выбрать по умолчанию. Грядущая интеграция Spray в Akka в качестве нового модуля akka-http является явным свидетельством этого.

person Thomas Lockney    schedule 12.07.2011
comment
Я бы очень хотел, чтобы кто-нибудь создал версию Netty+Unfiltered, которая использует Jetty Continuations и/или Servlet 3.0 Async, чтобы я мог подключить к ней Akka. Мне очень любопытно услышать о вашем опыте с Akka в целом, если хотите, в частном порядке. Продолжайте в том же духе, √ - person Viktor Klang; 12.07.2011
comment
Да, если время когда-либо позволяет, я хотел бы принять участие в добавлении этого. Я знаю, что здесь уже есть некоторые наработки, но трудно понять, сколько работы еще предстоит сделать. И это мой первый набег на веб-сокеты (хотя в прошлом я много работал с кометой), я не сомневаюсь в возможных осложнениях. - person Thomas Lockney; 12.07.2011
comment
Э-э, я хотел сказать, я знаю, что уже есть некоторые наработки в том смысле, что работа была начата, чтобы сделать это непосредственно в Акке. Не уверен, что кто-нибудь пытался реализовать это в Unfiltered через API Jetty/Servlet 3.0. Я должен пойти исследовать это... о, сколько бы я отдал за свободное время. - person Thomas Lockney; 12.07.2011
comment
У меня слишком мало опыта работы с кодовой базой Unfiltered, но я участвовал как в проекте Atmosphere, так и в исправленных ошибках в Mist, поэтому у меня достаточно опыта работы с Comet. К сожалению, Джонас сейчас в отпуске, так что у меня много работы, но я бы хотел, чтобы кто-нибудь это подхватил. Unfiltered имеет отличную производительность, поэтому сочетание с асинхронностью было бы убийственным. - person Viktor Klang; 12.07.2011
comment
Здесь много потрясающей информации. Спасибо за то же. - person Kamesh Rao Yeduvakula; 13.07.2011
comment
@Thomas Как dropwizard сравнивается со спреем или scalatra? - person Kamesh Rao Yeduvakula; 13.07.2011
comment
Ссылки на реализацию веб-сокетов Unfiltered не работают - person seinecle; 20.08.2013
comment
В недавних тестах (см. glennengstrand.info/software/performance/scala/clojure) я обнаружил, что dropwizard работает в 3 раза быстрее, чем Clojure на Ring, что сравнимо со Scala на Finatra, который работает в 3 раза быстрее (см. glennengstrand.info/software/performance/scala/clojure ), чем Spray. Мне нравится Akka за то, что она изначально предназначалась для реактивной среды программирования. Он никогда не предназначался для использования в качестве контейнера для веб-приложений. - person Glenn; 05.12.2016

Если вы хотите, чтобы это сделал КОД, то вот он. Мне потребовалось некоторое время, чтобы действительно понять, что происходит, потому что есть ТОННА примеров, и неясно, что они все делают или как собрать все это вместе. Оказывается, это было проще, чем я думал:

package com.nthalk.akkatest

import akka.actor.Actor.actorOf
import akka.actor.Actor
import akka.camel.Consumer
import akka.camel.Message
import akka.camel.CamelServiceManager

class MyActor extends Actor with Consumer {
  def endpointUri = "jetty:http://localhost:8877/"
  def receive = {
    case msg: Message => { self.reply("State Rest Service: Achieved") }
    case _ => { self.reply("Really, no message?") }
  }
}

object App extends scala.App {
  actorOf[MyActor].start
  CamelServiceManager.startCamelService
}

И мой build.sbt выглядит так:

organization := "com.nthalk"

name := "akkatest"

version := "0.1.0"

resolvers += 
  "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"

libraryDependencies ++= Seq(
  "org.apache.camel" % "camel-jetty" % "2.9.0",
  "se.scalablesolutions.akka" % "akka-camel" % "1.3.1"
  )

Надеюсь это поможет!

person Nthalk    schedule 28.02.2012

Для полноты полезно иметь пример Scalatra (поскольку вопрос задан о Scalatra). Вот пример кода из Руководства по Scalatra Akka:

package com.example.app

import akka.actor.{ActorRef, Actor, Props, ActorSystem}
import akka.dispatch.ExecutionContext
import akka.util.Timeout
import org.scalatra.FutureSupport
import org.scalatra.{Accepted, ScalatraServlet}

class MyActorApp(system:ActorSystem, myActor:ActorRef) extends ScalatraServlet with     FutureSupport {

  protected implicit def executor: ExecutionContext = system.dispatcher

  import _root_.akka.pattern.ask
  implicit val timeout = Timeout(10)

  get("/async") {
    new AsyncResult { def is = myActor ? "Do stuff and give me an answer" }
  }

  get("/fire-forget") {
    myActor ! "Hey, you know what?"
    Accepted()
  }
}

class MyActor extends Actor {
  def receive = {
    case "Do stuff and give me an answer" => sender ! "The answer is 42"
    case "Hey, you know what?" => println("Yeah I know... oh boy do I know")
  }

}
person futurechimp    schedule 04.04.2013
comment
Я получил следующую ошибку с примером кода: scala: не удалось найти неявное значение для тайм-аута параметра: akka.util.Timeout new AsyncResult { val is = myActor? Сделай что-нибудь и дай мне ответ } - person Owen; 13.04.2013

Сервлеты HTTP и множество контейнеров — проверенная и надежная технология. Akka предлагает вам на выбор собственный встроенный контейнер сервлетов , или вы можете использовать его со своим собственным.

Вы можете, конечно, развернуть свой собственный веб-сервер с помощью Netty, и есть интересная запись -об этом в Интернете.

person opyate    schedule 12.07.2011

используя http://doc.akka.io/docs/akka-stream-and-http-experimental/1.0-M4/scala.html?_ga=1.185389673.1332942331.1425954937 (люди также называют его spray-2.0), который основан на akka-streams.

person Windor C    schedule 13.03.2015

Я не знаю, почему вы с подозрением относитесь к использованию контейнера сервлетов в качестве основы - на самом деле он никоим образом не ограничивает ваш выбор, он просто обрабатывает базовые настройки HTTP-сервера. Таким образом, большинство инфраструктур служб Java используют API-интерфейс сервлета в качестве базовой основы, даже если они не раскрывают этот уровень.

Я думаю, что DropWizard — отличный выбор для всех видов сервисов отдыха JVM, в том числе тех, которые используют Akka для реального подъема. Помимо очевидной причины его совершенства (на основе коллекции библиотек, которые оказались «лучшими для JVM»), мне это нравится, потому что это помогает в областях, которые не учитывают многие другие библиотеки/фреймворки: создание метрик, декларативная проверка; все время сохраняя вещи простыми, явными и понятными.

person StaxMan    schedule 12.03.2012