Concurrency 在Kafka流中执行异步转换

Concurrency 在Kafka流中执行异步转换,concurrency,apache-kafka,apache-kafka-streams,Concurrency,Apache Kafka,Apache Kafka Streams,假设我有两个卡夫卡主题,A和B。我试图开发一个系统,从A中提取记录,对每个记录应用转换,然后将转换后的记录发布到B。在这种情况下,转换涉及通过HTTP调用REST端点 作为卡夫卡的新手,我很高兴看到卡夫卡流项目已经解决了这类问题(使用转换发布)。不幸的是,我发现Kafka流中的转换正在阻塞操作。出于本能,我尝试以非阻塞、异步的方式调用HTTP端点 这是否意味着卡夫卡流在这种情况下不起作用?这是否意味着我必须返回到以阻塞方式调用REST端点?这对卡夫卡流来说是一种可以接受的模式吗?基于流的数据处理

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

作为卡夫卡的新手,我很高兴看到卡夫卡流项目已经解决了这类问题(使用转换发布)。不幸的是,我发现Kafka流中的转换正在阻塞操作。出于本能,我尝试以非阻塞、异步的方式调用HTTP端点


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

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


我不熟悉卡夫卡和卡夫卡流(以下简称“卡夫卡”),但遇到并思考过类似的问题,以下是我的观点:

卡夫卡有两个显著特点:

  • 所有并行性都是通过主题的划分来实现的
  • 在一个主题的分区内,处理是强顺序的,一次一个
  • 许多非常好的属性都来自这些特性。例如,我认为,是最酷的

    当然,这些属性是否真的是您想要的“特性”,取决于应用程序。如果您不希望使用基于主题分区的并行性进行强有序处理,那么您可能不希望对该应用程序使用Kafka

    因此,关于:

    这是否意味着卡夫卡流在这种情况下不起作用

    它可以工作,但是通过增加分区可以提高并行性

    这是否意味着我必须返回到以阻塞方式调用REST端点


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

    最好能多了解一点您打算如何处理这些调用。介意发布(伪)代码来构建您正在使用的Kafka Streams实例吗?我这样问是因为调用REST端点听起来不像是典型的转换。后者通常意味着改变键和值。Adam,你有没有研究过这个问题的实际异步方法?仔细研究之后,我认为我的答案可能不完整或错误。顺便说一句,我不认为在这里发出HTTP请求有什么特别之处。您可以将“HTTP请求”替换为任何类型的“访问远程状态”。可能是远程数据库,对吗?无论哪种方式,访问都必须是同步的,因为您的流处理函数在每条消息中自上而下运行一次。哦,顺便说一下,相关配置可以在这里找到::
    num.stream.threads:执行流处理的线程数
    ;因此,如果你想用一台机器处理多个分区,你可以增加线程数来匹配你的分区数。Kafka将分区分配给任务,我认为一个线程可以处理所有分区()。只需跳进去突出显示最新的文档就可以在。
    /2.1.0-alpha1/
    链接用于Kafka Streams技术预览版,由于Apache Kafka 0.10.0.0(包括Kafka Streams的第一个版本)正式发布,该预览版已被弃用。