如何使用Kafka Streams的Futures

时间:2017-02-15 10:46:34

标签: scala stream apache-kafka-streams

有一个kafka集群,我从中消耗了两个主题并加入它。随着连接的结果我用数据库做一些操作。对DB的所有操作都是异步的,因此它们返回一个Future(scala.concurrent.Future,但无论如何它与java.util.concurrent.CompletableFuture相同)。因此,我得到了这样的代码:

val firstSource: KTable[String, Obj]
val secondSource: KTable[String, Obj2]

def enrich(data: ObjAndObj2): Future[EnrichedObj]
def saveResultToStorage(enrichedData: Future[EnrichedObj]): Future[Unit]

firstSource.leftJoin(secondSource, joinFunc)
           .mapValues(enrich)
           .foreach(saveResultToStorage)

我是否可以使用流中的未来值进行操作,或者有更好的方法来处理异步任务(例如Akka流中的.mapAsync)?

1 个答案:

答案 0 :(得分:4)

我有同样的问题。据我所知,Kafka Streams不是像Akka Streams一样处理多速率流媒体的。 Kafka Streams没有相当于Akka具有mapAsync,throttle,conflate,buffer,batch等的多速率原语.Kafka Streams擅长处理主题和有状态数据聚合之间的连接。 Akka Streams擅长多速率和异步处理。

您有几个选择如何处理:

  • 在Kafka Streams应用中拨打阻止电话。这是最简单的,如果您的Future调用的吞吐量不比它们的延迟大很多,那就没问题了。 Kafka Streams每个分区使用单独的线程,因此您可以使用正在处理的Kafka主题的分区来推动并行性。
  • 使用Reactive Kafka库处理Akka Streams中的浓缩,将丰富的结果发布到另一个Kafka主题,然后将其带入Kafka Streams应用程序。这就是我们针对异步调用具有比端到端延迟(如Web服务调用或对NoSQL数据库的查询)更快的并行吞吐量的情况所做的事情。
  • 将您的所有浓缩数据发布到自己的KTable并将其加入Kafka Streams应用程序。实际上,通过KTables将流数据与丰富数据相结合是Kafka Streams擅长的。如果浓缩数据可以表示为表格,我们使用它。如果必须动态计算浓缩数据,它就不起作用。