Mag*_*nus 12 rest scala scalability jersey akka
我有一个使用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()
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
小智 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")
}
}
Run Code Online (Sandbox Code Playgroud)
可以在akka网站上找到更多文档:http://doc.akkasource.org/http
| 归档时间: |
|
| 查看次数: |
3419 次 |
| 最近记录: |