Scala 并行运行akka流

Scala 并行运行akka流,scala,parallel-processing,akka,akka-stream,akka-http,Scala,Parallel Processing,Akka,Akka Stream,Akka Http,我有一条小溪 侦听HTTP post接收事件列表 mapconcat流元素中的事件列表 转换卡夫卡记录中的事件 使用反应式卡夫卡制作记录(akka stream卡夫卡制作接收器) 这是简化的代码 // flow to split group of lines into lines val splitLines = Flow[List[Evt]].mapConcat(list=>list) // sink to produce kafka records in kafka val ka

我有一条小溪

  • 侦听HTTP post接收事件列表
  • mapconcat流元素中的事件列表
  • 转换卡夫卡记录中的事件
  • 使用反应式卡夫卡制作记录(akka stream卡夫卡制作接收器)
  • 这是简化的代码

    // flow to split group of lines into lines
      val splitLines = Flow[List[Evt]].mapConcat(list=>list)
    
    // sink to produce kafka records in kafka
    val kafkaSink: Sink[Evt, Future[Done]] = Flow[Evt]
        .map(evt=> new ProducerRecord[Array[Byte], String](evt.eventType, evt.value))
        .toMat(Producer.plainSink(kafka))(Keep.right)
    
    val routes = {
        path("ingest") {
          post {
            (entity(as[List[ReactiveEvent]]) & extractMaterializer) { (eventIngestList,mat) =>
                val ingest= Source.single(eventIngestList).via(splitLines).runWith(kafkaSink)(mat)
                val result = onComplete(ingest){
                  case Success(value) => complete(s"OK")
                  case Failure(ex)    => complete((StatusCodes.InternalServerError, s"An error occurred: ${ex.getMessage}"))
                }
                complete("eventList ingested: " + result)
              }
          }
        }
      }
    
    你能给我强调一下什么是并行运行的,什么是顺序运行的吗

    我认为mapConcat将流中的事件顺序化,那么我如何并行化流,以便在mapConcat之后,每个步骤都将并行处理


    一个简单的无序映射就足够了吗?或者我应该使用带有平衡和合并的GraphDSL吗?

    在您的情况下,我认为它将是顺序的。此外,在开始将数据推送到卡夫卡之前,您会收到整个请求。我将使用
    extractDataBytes
    指令,该指令将为您提供
    src:Source[ByteString,Any]
    。然后我会像这样处理它

    src
      .via(Framing.delimiter(ByteString("\n"), 1024 /* Max size of line */ , allowTruncation = true).map(_.utf8String))
      .mapConcat { line =>
        line.split(",")
      }.async
      .runWith(kafkaSink)(mat)
    

    对你来说,我认为这是循序渐进的。此外,在开始将数据推送到卡夫卡之前,您会收到整个请求。我将使用
    extractDataBytes
    指令,该指令将为您提供
    src:Source[ByteString,Any]
    。然后我会像这样处理它

    src
      .via(Framing.delimiter(ByteString("\n"), 1024 /* Max size of line */ , allowTruncation = true).map(_.utf8String))
      .mapConcat { line =>
        line.split(",")
      }.async
      .runWith(kafkaSink)(mat)
    

    extractDataBytes的问题是我无法轻松地解组JSON…嗯,我明白了。我从不需要解析无限的json流,但我听说jawn支持它。extractDataBytes的问题是我无法轻松地解组JSON…嗯,我明白了。我从不需要解析无限的json流,但我听说jawn支持它。