簡體   English   中英

使用Akka Streams動態扇出

[英]Dynamic fan out with Akka Streams

我正在構建一個經歷了幾個步驟的Akka Streams應用程序。 有一個特定步驟產生0或更多結果,事先不知道有多少結果。 每個結果都必須異步處理(通過相同類型的組件),最后必須合並所有結果。

我應該如何在Akka Streams中對此進行建模? 我注意到GraphDsl有一個Broadcast元素,可以讓你為扇形建模,但這似乎只有在預先知道出口數量時才有可能。 在Akka Streams中有沒有辦法讓廣播有一些東西,但那些粉絲會出現在動態數量的網點上?

查看此頁面中的中心: https//doc.akka.io/docs/akka/current/stream/stream-dynamic.html? language = scala

在許多情況下,某個服務的消費者或生產者(表示為接收器,源或可能的流)是動態的並且事先不知道。 Graph DSL不允許表示這一點,圖表的所有連接必須事先知道並且必須預先連接。 要允許動態扇入和扇出流,應使用集線器。

事實證明mapConcat做了我想要的。 這是一個POC:

package streams

import scala.concurrent._
import akka._
import akka.actor._
import akka.stream._
import akka.stream.scaladsl._
import scala.util.Random

object StreamsTest extends App {
  implicit val system = ActorSystem("TestSystem")
  implicit val materializer = ActorMaterializer()
  import system.dispatcher

  case class SplitRequest(s: String)

  def requestHandlerWithMultipleResults(request: SplitRequest): List[String] = 
   request.s.split(" ").toList

  def slowProcessingTask(s: String) =  {
    Thread.sleep(Random.nextInt(5000))
    s.toUpperCase
  }

  val g = RunnableGraph.fromGraph(GraphDSL.create() { implicit builder: GraphDSL.Builder[NotUsed] =>
    import GraphDSL.Implicits._

    val source: Source[String, NotUsed] = Source(List(SplitRequest("january february march april may")))
      .mapConcat(requestHandlerWithMultipleResults)
      .mapAsyncUnordered(5)(s => Future(slowProcessingTask(s)))

    val sink = Sink.foreach(println)

    source ~> sink

    ClosedShape
  })

  g.run()
}

輸出,例如:

MAY
JANUARY
FEBRUARY
MARCH
APRIL

暫無
暫無

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

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