我有一个用例,在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
这是最好的方法吗?你们实际推荐哪些方式以及为什么?这个用例范围内的几个最好的实例会很棒!
提前致谢:)
答案 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
这是连续查询具有不同请求对象的同一服务器的最常见模式。