如何扩展使用Akka的Scala REST应用程序?

时间:2010-08-21 22:24:47

标签: scala rest jersey akka scalability

我有一个使用Akka的Scala应用程序,它接收REST请求,对数据库进行一些操作,并向客户端回复一些信息。实际上,我的数据库操作需要很长时间,而我的启用REST的actor在此期间无法响应新请求,即使我可以同时对数据库运行大量操作。我正在使用javax.ws.rs注释来启用我的actor中的REST方法。

问题;什么是使我的应用程序能够处理大量并发请求的最佳方法?

编辑:我将添加一些示例代码。

  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 bean仍然等待第一个请求完成后才能处理下一个请求。

[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 个答案:

答案 0 :(得分:7)

您似乎使用的是旧版Akka。

我建议升级到0.10(将Actors和RS-Beans分开),然后你可以使用LoadBalancer 1(和2)来限制工作量,或者利用WorkStealingDispatcher { {3}}(和3

这有帮助吗?

答案 1 :(得分:6)

虽然我现在意识到这个帖子已经过时了4个月,但值得注意的是Akka有一个新的HTTP模块实现,可以有效地将请求转移到一个actor中。这种方法利用异步servlet API(也适用于Jetty延续)来使挂起的请求作为消息通过系统传递,并在任何时候恢复;消除,例如,需要使用!!触发演员工作并在注释的POJO中作出回应。同样,由于请求在容器中暂停,并且上下文尽可能快地转换为actor,因此没有线程阻塞来处理响应或将来。

今天可能会重写上述示例的一种天真的方式:

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

答案 2 :(得分:3)

收到请求后,您应该创建一个新的actor来处理该请求。传递原始发件人,以便新创建的演员知道应答者。

答案 3 :(得分:1)

虽然这个帖子已经老了,但我想把Spiffy(插件!)添加到组合中:

https://github.com/mardambey/spiffy

什么是Spiffy?

...漂亮

  • 是用Scala编写的
  • 使用梦幻般的Akka图书馆和演员来扩展
  • 使用servlet API 3.0进行异步请求处理
  • 是模块化的(替换组件是直接的)
  • 使用DSL来减少您不想要的代码
  • 支持控制器周围的请求挂钩

Spiffy是一个使用Scala,Akka(Scala actor实现)和Java Servelet 3.0 API的Web框架。它利用异步接口,旨在为Web应用程序提供大规模并行和可扩展的环境。 Spiffy的各种组件都基于这样的想法,即它们需要是独立的简约模块,可以非常快速地完成少量工作,并将请求移交给管道中的下一个组件。完成最后一个组件处理请求后,它通过“完成”请求并将其发送回客户端来发信号通知servlet容器。