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
// 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支持它。