12

我有一个使用 Akka 的 Scala 应用程序,它接收 REST 请求,对数据库进行一些操作,并向客户端响应一些信息。事实上,我的数据库操作需要很长时间,同时我的支持 REST 的参与者无法响应新请求,即使我可以同时对数据库运行大量操作。我在我的演员中使用 javax.ws.rs 注释来启用 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

4 回答 4

7

您似乎使用的是旧版本的 Akka。

我建议升级到 0.10(将 Actor 和 RS-Bean 分开),然后您可以使用 LoadBalancer 1(和2)来限制工作负载,或者利用 WorkStealingDispatcher 3(和4

这有帮助吗?

于 2010-08-22T13:49:12.367 回答
6

虽然我意识到这个线程现在已经过时了 4 个多月,但值得注意的是 Akka 有一个新的 HTTP 模块实现,可以有效地将请求传输到一个 actor。这种方法利用异步 servlet API(也适用于 Jetty 延续)来使挂起的请求能够作为消息通过系统传递并在任何时候恢复;消除,例如,需要使用 !! 触发actor工作并在带注释的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

于 2010-12-21T19:55:52.530 回答
3

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

于 2010-08-21T23:12:18.880 回答
1

虽然这个线程很旧,但我想添加 Spiffy (plug!) 到组合中:

https://github.com/mardambey/spiffy

什么是漂亮的?

漂亮的...

  • 是用 Scala 编写的
  • 使用了不起的 Akka 库和演员来扩展
  • 使用 servlet API 3.0 进行异步请求处理
  • 是模块化的(更换组件很简单)
  • 使用 DSL 减少不需要的代码
  • 支持控制器周围的请求挂钩

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

于 2011-03-30T01:54:26.647 回答