首页 文章

akka http:阿卡流与演员 Build 休息服务

提问于
浏览
17

在akka http上使用60 API创建REST Web服务时 . 如何选择是否应该选择akka流或akka演员?在他的post中,乔斯展示了两种在akka http上创建API的方法,但他没有显示何时我应该选择一个而不是另一个 .

2 回答

  • 9

    不要忘记期货!

    我要对Rudiger Klaehn做出的一个补充的一个附录是考虑Future的用例 . 期货的可组合性和资源管理使得期货成为许多(如果不是大多数)情况的理想选择 .

    有一个很好的blog post描述Futures比Actors更好的选择 . 此外,Streams提供的背压带来了一些相当大的overhead .

    仅仅因为你使用akka-http击倒了兔子洞并不意味着请求处理程序中的所有并发都必须限制在Actors或Streams中 .

    Route

    Route 本能适应_521242中的期货:

    type Route = (RequestContext) ⇒ Future[RouteResult]
    

    因此,您可以仅使用函数和期货直接将Future烘焙到您的Route中,无需指令:

    val requestHandler : RequestContext => HttpResponse = ???
    
    val route : Route = 
      (requestContext) => Future(requestHandler(requestContext)) map RouteResult.Complete
    

    onComplete Directive

    onComplete指令允许您在路线中使用"unwrap"未来:

    val route = 
      get {
    
        val future : Future[HttpResponse] = ???
    
        onComplete(future) {
          case Success(httpResponse) => complete(httpResponse)
          case Failure(exception)    => complete(InternalServerError -> exception.toString)
        }
      }
    
  • 21

    这是一个棘手的问题 . 显然,这两种方法都有效 . 所以在某种程度上这是品味/熟悉的问题 . 所以现在关注的一切只是我个人的意见 .

    如果可能的话,我更喜欢使用akka-stream,因为它具有更高级别的性质和类型安全性 . 但这是否是一种可行的方法在很大程度上取决于REST API的任务 .

    Akka-stream

    如果您的REST API是一项服务,例如基于外部数据(例如货币兑换率API)回答问题,优选使用akka-stream实现它 .

    akka-stream最好的另一个例子是某种数据库前端,其中REST API的任务是解析查询参数,将它们转换为数据库查询,执行查询并根据请求的内容类型转换结果由用户 . 在这两种情况下,数据流都很容易映射到akka-stream原语 .

    演员

    如果您的API允许查询和更新群集上的多个持久性actor,则可以使用actor更好的示例 . 在这种情况下,基于纯粹的基于actor的解决方案或混合解决方案(使用akka-stream解析查询参数和转换结果,使用actor执行其余操作)可能更可取 .

    基于actor的解决方案可能更受欢迎的另一个例子是,如果您有长期运行请求的REST API(例如websockets),并且希望在群集上部署REST API本身的处理管道 . 我认为使用akka-stream目前无法实现这样的目标 .

    摘要

    总结一下:查看每个API的数据流,看看它是否干净地映射到akka-stream提供的原语 . 如果是这种情况,请使用akka-stream实现它 . 否则,使用actor或混合解决方案实现 .

相关问题