在 Kafka Stream 中执行异步转换

Performing an asynchronous transformation within a Kafka Stream

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

作为 Kafka 的新手,我很高兴看到 Kafka Streams 项目已经解决了此类问题(消费-转换-发布)。不幸的是,我发现 Kafka 流中的转换是 阻塞 操作。本能地,我尝试以 非阻塞 异步方式调用 HTTP 端点。

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

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


我是Kafka和Kafka Streams(以下简称"Kafka")的新手,遇到过类似的问题,思考过,以下是我的观点:

Kafka有两个显着特点:

  1. 所有的并行都是通过主题的划分来实现的
  2. 在主题的分区内,处理是强顺序的,一次一个。

许多非常好的属性都脱离了这些功能。例如,stream-based "transactions",我认为是最酷的之一。

但是这些属性是否确实是您想要的 "features" 当然,取决于应用程序。如果您不希望基于主题分区的并行性进行强顺序处理,那么您可能不希望为该应用程序使用 Kafka。

所以,关于:

Does this mean that Kafka Streams will not work in this situation?

它会起作用,但增加的并行度是通过增加分区来实现的。

Does this mean that I must revert back to calling the REST endpoint in a blocking manner?

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