Как мне масштабировать мое приложение Scala REST, которое использует Akka? - PullRequest
12 голосов
/ 22 августа 2010

У меня есть приложение Scala, использующее Akka, которое получает запросы REST, выполняет некоторые операции с базой данных и отвечает некоторой информацией клиенту.Как таковой, мои операции с БД занимают много времени, и мой субъект с поддержкой REST не может отвечать на новые запросы в то же время, даже несмотря на то, что я мог одновременно выполнять множество операций с БД.Я использую аннотации javax.ws.rs для методов REST-enable в моем актере.

Вопрос;Каков наилучший способ, позволяющий моему приложению обрабатывать большое количество одновременных запросов?

РЕДАКТИРОВАТЬ : я добавлю пример кода.

  import se.scalablesolutions.akka.actor._
  import javax.ws.rs._

  @Path("/test")
  class TestService {

    @GET
    def status() = 
      actorPool !! Status(session).
        getOrElse(<error>Unable to connect to service</error>)
  }

  class TestActor {

    def receive = {
      case Status() => {
        reply(SomeObject.slowDBMethod)
      }
    }
  }

  case class Status()

EDIT2 : Это то, что я получаю в журнале.Я отправляю три запроса из своего браузера так быстро, как могу переключать вкладки и нажимаю F5, но бин RS все еще ожидает завершения первого запроса, прежде чем обрабатывать следующий.

[INFO] [2010-08-29 16:27:03,232] [akka:event-driven:dispatcher:global-15] c.n.StatusActor: got Slow request
[INFO] [2010-08-29 16:27:06,916] [akka:event-driven:dispatcher:global-10] c.n.StatusActor: got Slow request
[INFO] [2010-08-29 16:27:10,589] [akka:event-driven:dispatcher:global-3] c.n.StatusActor: got Slow request

Ответы [ 4 ]

7 голосов
/ 22 августа 2010

вы, похоже, используете более старую версию Akka.

Я рекомендую обновить до 0.10 (который разделяет Актеров и RS-Beans), тогда вы можете использовать LoadBalancer 1 2 ) для регулирования рабочей нагрузки или использования WorkStealingDispatcher 3 4 )

Это помогает?

6 голосов
/ 21 декабря 2010

Хотя я понимаю, что этот поток устарел на 4+ месяца, стоит отметить, что у Akka есть новая реализация модуля HTTP, которая эффективно передает запрос в субъект.Этот подход использует API асинхронного сервлета (также работает с продолжениями Jetty), чтобы разрешить передачу приостановленного запроса через систему в виде сообщения и возобновление в любой момент;устраняя, например, необходимость использования !!вызвать актерскую работу и ответить в аннотированном POJO.Аналогичным образом, поскольку запрос приостановлен в контейнере, и контекст переходит в субъект как можно быстрее, нет потоков, блокирующих обработку ответа или будущего.

Один наивный способ, которым может быть приведенный выше примерпереписано сегодня:

class TestEndpoint extends Actor with Endpoint {
   def hook(uri:String) = uri == "/test"
   def provide(uri:String) = actorOf[TestService].start

   override def preStart = {
     ActorRegister.actorsFor[classOf[RootEndpoint]).head ! Endpoint.Attach(hook, provide)
   }

   def receive = handleHttpRequest
}

class TestService extends Actor {
   def receive = {

     case get:Get => 
       get.timeout(SomeObject.TimeoutInSeconds) // for example
       get.OK(SomeObject.slowDBMethod)

     case other:RequestMethod =>
      other.NotAllowed("Invalid method for this endpoint")
   }
}

Дополнительную документацию можно найти на сайте akka: http://doc.akkasource.org/http

3 голосов
/ 22 августа 2010

Получив запрос, вы должны создать нового субъекта для обработки этого запроса.Передайте оригинального отправителя, чтобы вновь созданный актер знал, кому отвечать.

1 голос
/ 30 марта 2011

Хотя эта тема старая, я бы хотел добавить в смесь Spiffy (plug!):

https://github.com/mardambey/spiffy

Что такое Spiffy?

Spiffy ...

  • написан на Scala
  • использует фантастическую библиотеку Akka и акторы для масштабирования
  • использует API сервлетов 3.0 для асинхронного запросаобработка
  • является модульной (замена компонентов выполняется просто)
  • использует DSL для сокращения количества кода, который вам не нужен
  • поддерживает перехваты запросов вокруг контроллеров

Spiffy - это веб-фреймворк, использующий Scala, Akka (реализация актера Scala) и API Java Servelet 3.0.Он использует асинхронный интерфейс и нацелен на обеспечение массовой параллельной и масштабируемой среды для веб-приложений.Различные компоненты Spiffy основаны на идее, что они должны быть независимыми минималистичными модулями, которые выполняют небольшие объемы работы очень быстро и передают запрос следующему компоненту в конвейере.После того, как последний компонент завершил обработку запроса, он сигнализирует контейнеру сервлетов, «завершив» запрос и отправив его обратно клиенту.

...