Scala 如何在卡夫卡流中使用未来
在Scala中使用Scala 如何在卡夫卡流中使用未来,scala,apache-kafka,apache-kafka-streams,Scala,Apache Kafka,Apache Kafka Streams,在Scala中使用org.apache.kafka.streams.KafkaStreams库时,我一直在尝试读取inputStream,将该信息传递给一个方法:validateAll(infoToValidate),该方法返回一个未来,解析该未来,然后发送到一个输出流 例如: builder.stream[String, Object](REQUEST_TOPIC) .mapValues(v => ValidateFormat.from(v.asInstanceOf[Gene
org.apache.kafka.streams.KafkaStreams
库时,我一直在尝试读取inputStream,将该信息传递给一个方法:validateAll(infoToValidate)
,该方法返回一个未来,解析该未来,然后发送到一个输出流
例如:
builder.stream[String, Object](REQUEST_TOPIC)
.mapValues(v => ValidateFormat.from(v.asInstanceOf[GenericRecord]))
.mapValues(infoToValidate => {
SuccessFailFormat.to(validateAll(infoToValidate))
})
是否有执行此操作的文档?我已经研究了filter()和transform(),但仍然不确定如何处理KStreams中的未来 答案取决于您是否需要保留消息的原始顺序。如果是,那么您将不得不以某种方式阻止。例如:
val duration = 10 seconds // whatever your timeout should be or Duration.Inf
sourceStream
.mapValues(x => Await.result(validate(x), duration))
.to(outputTopic)
但是,如果订单不重要,您可以简单地使用卡夫卡制作人:
sourceStream
.mapValues(x => validate(x)) // now you have KStream[.., Future[...]]
.foreach { future =>
future.foreach { item =>
val record = new ProducerRecord(outputTopic, key, item)
producer.send(record) // provided you have the implicit serializer
}
}
答案取决于您是否需要保留消息的原始顺序。如果是,那么您将不得不以某种方式阻止。例如:
val duration = 10 seconds // whatever your timeout should be or Duration.Inf
sourceStream
.mapValues(x => Await.result(validate(x), duration))
.to(outputTopic)
但是,如果订单不重要,您可以简单地使用卡夫卡制作人:
sourceStream
.mapValues(x => validate(x)) // now you have KStream[.., Future[...]]
.foreach { future =>
future.foreach { item =>
val record = new ProducerRecord(outputTopic, key, item)
producer.send(record) // provided you have the implicit serializer
}
}
为什么不
.get()
未来?@cricket\u 007你不能.get()
scala的未来。您必须在其上执行映射或等待,因为我不是专家,但KStreams接口似乎本质上是同步的。这可能意味着您需要在代码中跨越sync/async边界-使用Await.result
+根据需要处理错误/超时+管理未来执行上下文的线程池。我认为这不是一个短视,而是一个设计决策——它确保消息不会被重新排序。基本上,我同意约翰的观点。顺便说一句,如果您使用模式注册表,它将自己验证消息的“格式”ValidateFormat.from
和SuccessFailFormat.to
和validateAll
?为什么不。get()
未来?@cricket\u 007您不能在scala中获得未来。您必须在其上执行映射或等待,因为我不是专家,但KStreams接口似乎本质上是同步的。这可能意味着您需要在代码中跨越sync/async边界-使用Await.result
+根据需要处理错误/超时+管理未来执行上下文的线程池。我认为这不是一个短视,而是一个设计决策——它确保消息不会被重新排序。基本上,我同意约翰的观点。顺便说一下,如果您使用模式注册表,它将自己验证消息的“格式”ValidateFormat.from
和SuccessFailFormat.to
和validateAll
的签名是什么?