【问题标题】:Performing an asynchronous transformation within a Kafka Stream在 Kafka 流中执行异步转换
【发布时间】:2016-06-11 13:15:26
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您能多了解一下您打算如何处理这些电话,那就太好了。介意发布(伪)代码来构建您正在使用的 Kafka Streams 实例吗?我问是因为调用 REST 端点听起来不像是典型的转换。后者通常意味着更改键和值。
  • Adam,你有没有为这个问题探索过实际的异步方法?看了更多,我认为我的答案可能不完整或错误。

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


【解决方案1】:

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


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

Kafka 有两个显着特点:

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

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

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

所以,关于:

这是否意味着 Kafka Streams 在这种情况下无法工作?

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

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

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

【讨论】:

  • 顺便说一句,我不认为在这里发出 HTTP 请求有什么特别之处。您可以将“HTTP 请求”替换为任何类型的“访问远程状态”。可能是一个远程数据库,对吧?无论哪种方式,访问都必须是同步的,因为您的流处理函数每条消息自上而下运行一次。
  • 哦,对了,相关配置可以在这里找到:docs.confluent.io/2.1.0-alpha1/streams/…:num.stream.threads: The number of threads to execute stream processing;因此,如果您想使用一台机器处理多个分区,您可以增加线程数以匹配您的分区数。
  • 再一次,我认为你甚至不需要增加线程数。 Kafka 为任务分配分区,我认为一个线程可以处理所有分区(docs.confluent.io/2.1.0-alpha1/streams/…)。
  • 只是强调一下,最新的文档可在docs.confluent.io/3.0.0/streams/… 获得。 /2.1.0-alpha1/ 链接用于 Kafka Streams 技术预览版,现在 Apache Kafka 0.10.0.0(包括 Kafka Streams 的第一个版本)已正式发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
相关资源
最近更新 更多