Akka-http合并传入连接

时间:2015-12-16 11:10:28

标签: scala akka akka-stream akka-http

我尝试使用akka-streams和akka-http来解决以下问题:

  • 我们有2个http客户端(A和B)向1个http服务器(C)发送请求。双方都使用akka-http进行沟通。
  • 来自A的请求与B相比具有更高的优先级,但两个请求应该是相同的进程。所以C应该首先处理来自A的请求,来自B的请求是第二优先的
  • 当然我们希望在每个端启用背压

我想出了以下代码,以便将传入的连接合并到一个输出:

val g = RunnableGraph.fromGraph(FlowGraph.create() { implicit b: FlowGraph.Builder[Unit] =>
    import FlowGraph.Implicits._

    val merge = b.add(MergePreferred[IncomingConnection](1))

    val inA: Source[IncomingConnection, Future[ServerBinding]] = Http().bind(interface = "localhost", port = 8200)
    val inB: Source[IncomingConnection, Future[ServerBinding]] = Http().bind(interface = "localhost", port = 8201)

    inA ~> merge.preferred
    inB ~> merge.in(0)
           merge.out ~> Sink.foreach(println)

    ClosedShape
}).run()

所以,我有来自A和B的传入连接的来源。

现在我想以某种方式处理它们,产生响应并将响应发送到相应的连接。

也许有更好的方法来归档所有这些东西,但我找不到任何解决此类问题的例子来自其他人的文档或问题。

我想这个问题很常见。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

mvn install对象用于处理请求和返回响应的方式是使用IncomingConnection方法。基于documentationapi的示例:

同步功能

handleXXX

然后可以在图表构造中使用此//this processor contains your logic for converting a request into a response def requestProcessor(httpRequest : HttpRequest) : HttpResponse = ??? val connectionSink = Sink.foreach[IncomingConnection] { conn => conn.handleWithSyncHandler(requestProcessor) }

connectionSink

异步功能

同样,如果您的处理器是异步的:

inA ~> merge.preferred
inB ~> merge.in(0)
       merge.out ~> connectionSink

<强>流量

最后,您还可以使用Flow(我的首选方法):

val asyncReqProcessor(httpRequest : HttpRequest) : Future[HttpResponse] = ???

val connectionSink = 
  Sink.foreach[IncomingConnection](_ handleWithAsyncHandler asyncProcessor)

关于Flows我最喜欢的一个功能是你可以重复使用它们。在不同的Streams。因此,flowReqProcessor可以是val flowReqProcessor : Flow[HttpRequest, HttpResponse,_] = ??? val connectionSink = Sink.foreach[IncomingConnection](_ handleWith flowReqProcessor ) 而不是val