加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:12:54 所属栏目:安全 来源:网络整理
导读:我有一个 Scala应用程序使用Akka接收REST请求,对数据库进行一些操作,并向客户端发送一些信息.就像这样,我的数据库操作需要很长时间,而我的REST启用的actor在此期间无法响应新的请求,尽管我可以在DB上同时执行大量操作.我在我的actor中使用javax.ws.rs注释来
我有一个 Scala应用程序使用Akka接收REST请求,对数据库进行一些操作,并向客户端发送一些信息.就像这样,我的数据库操作需要很长时间,而我的REST启用的actor在此期间无法响应新的请求,尽管我可以在DB上同时执行大量操作.我在我的actor中使用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个月了,值得注意的是,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读