在Kafka Stream中执行异步转换

时间:2016-06-11 13:15:26

标签: concurrency apache-kafka apache-kafka-streams

假设我有两个Kafka主题, A B 。我正在尝试开发一个从 A 中提取记录的系统,对每条记录应用转换,然后将转换后的记录发布到 B 。在这种情况下,转换涉及通过HTTP调用REST端点。

对Kafka来说相对较新,我很高兴看到Kafka Streams项目已经解决了这类问题(consume-transform-publish)。不幸的是,我发现Kafka流中的转换是阻止操作。本能地,我尝试以非正常方式非阻塞调用HTTP端点。

这是否意味着Kafka Streams在这种情况下不起作用?这是否意味着我必须恢复以阻塞方式调用REST端点?这对Kafka Streams来说甚至是一种可接受的模式吗?基于流的数据处理对我来说还是比较新的,所以我并不完全熟悉它的并发模型。

1 个答案:

答案 0 :(得分:3)

更新:在进一步研究之后,我不确定这是不是正确答案......

我是Kafka和Kafka Streams(以下简称“Kafka”)的新手,但遇到并考虑过类似的问题,这是我的观点:

卡夫卡有两个突出的特点:

  1. 所有并行性都是通过主题划分来实现的
  2. 在主题的分区内,一次一个地强加序处理。
  3. 许多非常好的属性都来自这些功能。例如,我认为stream-based "transactions"是最酷的之一。

    但是,这些属性实际上是否是您想要的“功能”,当然取决于应用程序。如果您不希望基于主题分区的并行性强排序处理,那么您可能不希望将Kafka用于该应用程序。

    所以,关于:

      

    这是否意味着Kafka Streams在这种情况下不起作用?

    它可以工作,但通过增加分区可以实现更高的并行性。

      

    这是否意味着我必须恢复以阻塞方式调用REST端点?

    是的,我认为确实如此 - 但我不确定为什么那会是“回归”。就个人而言,这就是我喜欢的Kafka:阻塞代码更简单。如果我想要更多并行性,我可以运行更多线程。毕竟,没有共享状态。