在scala-stream流中组合akka-http流的最佳方法是什么?

时间:2016-06-06 13:58:01

标签: scala akka-stream akka-http

我有一个用例,在Akka-stream的 n 流之后,我必须获取其中一个的结果并向HTTP REST API发出请求。

最后一个akka-stream流类型,在HTTP请求之前是一个字符串:

val stream1:Flow[T,String,NotUsed] = Flow[T].map(_.toString)

现在,应该指定HTTP请求,我想到了类似的东西:

val stream2: Flow[String,Future[HttpRespone],NotUsed] = Flow[String].map(param => Http.singleRequest(HttpRequest(uri=s"host.com/$param")))

然后合并它:

val stream3 = stream1 via stream2

这是最好的方法吗?你们实际推荐哪些方式以及为什么?这个用例范围内的几个最好的实例会很棒!

提前致谢:)

1 个答案:

答案 0 :(得分:3)

您的实施将为每个新参数创建与"host.com"的新连接。这是不必要的,并阻止akka进行某些优化。在引擎盖下,akka实际上保持一个连接池以重用开放连接,但我认为最好在代码中指定您的意图而不是依赖于底层实现。

您可以按照documentation

中的说明进行单一连接
val connectionFlow: Flow[HttpRequest, HttpResponse, _] = 
  Http().outgoingConnection("host.com")

要利用此连接流,您需要将String路径转换为HttpRequest个对象:

import akka.http.scaladsl.model.Uri
import akka.http.scaladsl.model.Uri.Path

def pathToRequest(path : String) = HttpRequest(uri=Uri.Empty.withPath(Path(path)))

val reqFlow = Flow[String] map pathToRequest

最后,将所有流量粘合在一起:

val stream3 = stream1 via reqFlow via connectionFlow

这是连续查询具有不同请求对象的同一服务器的最常见模式。