簡體   English   中英

使用 Akka Graphs 實現簡單的架構

[英]Implement simple architecture using Akka Graphs

我正在嘗試設置一個簡單的圖形結構,通過調用休息服務來處理數據,在轉發結果之前將每個服務的結果轉發到中間處理單元。 這是一個高級架構:

在此處輸入圖片說明

這可以使用 Akka 圖流來定義嗎? 閱讀https://doc.akka.io/docs/akka/current/stream/stream-graphs.html我什至不明白如何實現這個簡單的架構。

我嘗試實現自定義代碼以在圖形中執行函數:

package com.graph

class RestG {

  def flow (in : String) : String = {
    return in + "extra"
  }

}

object RestG {

  case class Flow(in: String) {

    def out : String = in+"out"
  }

  def main(args: Array[String]): Unit = {

    List(new RestG().flow("test") , new RestG().flow("test2")).foreach(println)

  }

}

我不確定如何在函數之間發送數據。 所以我想我應該使用 Akka Graphs 但如何實現上面的架構?

這是我將如何解決這個問題。 首先是一些類型:

type Data = Int
type RestService1Response = String
type RestService2Response = String
type DisplayedResult = Boolean

然后存根函數異步調用外部服務:

def callRestService1(data: Data): Future[RestService1Response] = ???
def callRestService2(data: Data): Future[RestService2Response] = ???
def resultCombiner(resp1: RestService1Response, resp2: RestService2Response): DisplayedResult = ???

現在是 Akka Streams(我沒有設置ActorSystem等)

import akka.Done
import akka.stream.scaladsl._

type SourceMatVal = Any
val dataSource: Source[Data, SourceMatVal] = ???

def restServiceFlow[Response](callF: Data => Future[Data, Response], maxInflight: Int) = Flow[Data].mapAsync(maxInflight)(callF)

// NB: since we're fanning out, there's no reason to have different maxInflights here...
val service1 = restServiceFlow(callRestService1, 4)
val service2 = restServiceFlow(callRestService2, 4)

val downstream = Flow[(RestService1Response, RestService2Response)]
  .map((resultCombiner _).tupled)

val splitAndCombine = GraphDSL.create() { implicit b =>
  import GraphDSL.Implicits._

  val fanOut = b.add(Broadcast[Data](2))
  val fanIn = b.add(Zip[RestService1Response, RestService2Response])

  fanOut.out(0).via(service1) ~> fanIn.in0
  fanOut.out(1).via(service2) ~> fanIn.in1

  FlowShape(fanOut.in, fanIn.out)
}

// This future will complete with a `Done` if/when the stream completes
val future: Future[Done] = dataSource
  .via(splitAndCombine)
  .via(downstream)
  .runForeach { displayableData =>
    ??? // Display the data
  }

可以在 Graph DSL 中完成所有連接,但我通常更喜歡讓我的圖階段盡可能簡單,並且僅在Source / Flow / Sink上的標准方法無法實現我想要的情況下使用它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM