Kafka:Consumer API vs Streams API

SR *_*han 65 apache-kafka kafka-consumer-api apache-kafka-streams

我最近开始学习Kafka并最终得到这些问题.

  1. Consumer和Stream有什么区别?对我来说,如果任何工具/应用程序消费来自Kafka的消息是Kafka世界中的消费者.

  2. 流是如何不同的,因为这也消耗或产生消息给卡夫卡?为什么需要它,因为我们可以使用Consumer API编写我们自己的消费者应用程序并根据需要处理它们或将它们从消费者应用程序发送到Spark?

我对此做了谷歌,但没有得到任何好的答案.对不起,如果这个问题太琐碎了.

Mic*_*oll 78

更新2018年4月9日:现在您还可以使用KSQL(Kafka的流式SQL引擎)来处理Kafka中的数据.KSQL建立在Kafka的Streams API之上,它还具有对"流"和"表"的一流支持.可以把它想象成Kafka Streams的SQL兄弟,你不必在Java或Scala中编写任何编程代码.

Consumer API和Streams API有什么区别?

Kafka的Streams API(https://kafka.apache.org/documentation/streams/)建立在Kafka的生产者和消费者客户之上.它比Kafka消费者客户端更强大,也更具表现力.以下是Kafka Streams API的一些功能:

  • 支持一次性处理语义(Kafka版本0.11+)
  • 支持容错状态处理,包括流连接,聚合窗口
  • 支持事件处理以及基于处理时间摄取时间的处理
  • 对流和表都有一流的支持,这是流处理与数据库相遇的地方; 实际上,大多数流处理应用程序都需要流和表来实现它们各自的用例,所以如果流处理技术缺少两个抽象中的任何一个(比如说,不支持表),你就会被卡住或必须自己手动实现这个功能(祝你好运......)
  • 支持交互式查询以将最新处理结果公开给其他应用程序和服务)
  • 更富有表现力:它附带了(1)功能的编程风格DSL与诸如操作map,filter,reduce以及(2)势在必行风格处理器API用于如做复杂事件处理(CEP),和(3)你甚至可以结合DSL和处理器API.

http://docs.confluent.io/current/streams/introduction.html获得更详细的,但仍然高层次介绍了卡夫卡流API,这也应该帮助你理解差异下级卡夫卡消费客户.还有一个基于Docker的Kafka Streams API教程,我在本周早些时候发表博客.

那么Kafka Streams API是如何不同的,因为这也消耗或产生消息给Kafka?

是的,Kafka Streams API既可以读取数据,也可以将数据写入Kafka.

为什么需要它,因为我们可以使用Consumer API编写我们自己的消费者应用程序并根据需要处理它们或将它们从消费者应用程序发送到Spark?

是的,你可以写你自己的使用者应用程序 - 正如我所提到的,卡夫卡流API使用卡夫卡消费客户(加上生产者客户端)本身 - 但你必须手动实现所有的流API提供的独特功能.请参阅上面的列表,了解"免费"获得的所有信息.因此,相当罕见的情况是用户会选择低级别的消费者客户端而不是更强大的Kafka Streams API.

  • 在什么情况下,应用程序使用Kafka Consumer API而不是Kafka Streams API? (4认同)
  • 主要是在需要直接访问Kafka Consumer API较低层方法的情况下。既然Kafka Streams可用了,通常就可以针对相当定制,专用的应用程序和用例进行此操作。打个比方:想象一下Kafka Streams是一辆汽车-大多数人只想驾驶它,却不想成为汽车修理工。但是有些人可能出于某种原因想要打开和调整汽车的引擎,这就是您可能想要直接使用Consumer API的时候。(话虽如此,Kafka Streams还具有满足自定义需求的Processor API。) (2认同)

sun*_*007 30

为支持 ETL 类型的消息转换而构建的 Kafka Stream 组件。表示从主题输入流,转换并输出到其他主题。它支持实时处理,同时支持聚合、加窗、连接等高级分析功能。

“Kafka Streams 通过构建 Kafka 生产者和消费者库并利用 Kafka 的本机功能来提供数据并行性、分布式协调、容错和操作简单性,从而简化了应用程序开发。”

以下是 Kafka Stream 的关键架构特性。请参考这里

  1. 流分区和任务:Kafka Streams 使用分区和任务的概念作为其基于 Kafka 主题分区的并行模型的逻辑单元。
  2. 线程模型: Kafka Streams 允许用户配置库可用于在应用程序实例中并行处理的线程数。
  3. 本地状态存储:Kafka Streams 提供了所谓的状态存储,可以被流处理应用程序用来存储和查询数据,这是实现有状态操作时的重要能力
  4. 容错: Kafka Streams 建立在 Kafka 原生集成的容错功能之上。Kafka 分区具有高可用性和可复制性,因此当流数据持久化到 Kafka 时,即使应用程序失败并需要重新处理它,它也是可用的。

根据我的理解,以下是关键差异,如果遗漏或误导任何一点,我愿意更新

在此处输入图片说明 在此处输入图片说明

在哪里使用消费者 - 生产者:

  1. 如果有单个消费者,则消费消息进程但不溢出到其他主题。
  2. 作为第 1 点,如果只有生产者生产消息,我们不需要 Kafka Stream。
  3. 如果消费者消息来自一个 Kafka 集群,但发布到不同的 Kafka 集群主题。在这种情况下,即使您可以使用 Kafka Stream,但您必须使用单独的 Producer 将消息发布到不同的集群。或者干脆使用 Kafka Consumer - Producer 机制。
  4. 批处理 - 如果需要收集消息或进行批处理,则可以使用正常的传统方式。

在哪里使用 Kafka Stream:

  1. 如果您使用来自一个主题的消息,那么 Kafka Stream 最适合转换并发布到其他主题。
  2. 实时处理、实时分析和机器学习。
  3. 聚合、连接窗口等状态转换。
  4. 计划使用本地状态存储或已安装的状态存储,例如 Portworx 等。
  5. 实现完全一种处理语义和自动定义的容错。

  • 太棒了,真的很有帮助,但是有一个重大错误,Consumer 和 Streams api 中的 Exactly Once 语义都可用,而且 EOS 只是较低级别的消费者/生产者的一堆设置,这样该设置组与其特定值相结合保证EOS行为。目前我正在将 EOS 与 Consumer api 一起使用,没有出现任何问题。 (2认同)
  • @uptoyou:“此外,EOS 只是较低级别的消费者/生产者的一堆设置”这是不正确的。Kafka Streams 中的 EOS 功能有几个重要功能,这些功能在普通 Kafka 消费者/生产者中是不可用的。消费者/生产者可以自己(DIY)实现这一点,这正是 Kafka 开发人员为 Kafka Streams 所做的,但这并不容易。详细信息请参见 https://www.confluence.io/blog/enabling-exactly-once-kafka-streams/ (2认同)