Kafka:消费者API与流API


102

我最近开始学习Kafka,并遇到了这些问题。

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

  2. Stream有何不同,因为它也会从Kafka消费或产生消息?为什么需要它,因为我们可以使用消费者API编写自己的消费者应用程序并根据需要对其进行处理,或者将其从消费者应用程序发送到Spark?

我在此方面使用了Google,但没有得到任何好的答案。抱歉,这个问题太琐碎了。

Answers:


108

更新2018年4月9日:现在,您还可以使用ksqlDB(Kafka的事件流数据库)在Kafka中处理数据。ksqlDB是在Kafka的Streams API之上构建的,它还具有对“ streams”和“ tables”的一流支持。

Consumer API和Streams API有什么区别?

Kafka的Streams库(https://kafka.apache.org/documentation/streams/)是建立在Kafka生产者和消费者客户端之上的。与普通客户端相比,Kafka Streams的功能明显更强大且更具表现力。

与Kafka Streams相比,使用Kafka Streams编写一个真实的应用程序开始要容易得多,而且要快得多。

以下是Kafka Streams API的一些功能,消费者客户端不支持其中的大多数功能(这将要求您自己实现缺少的功能,实质上是重新实现Kafka Streams)。

  • 通过Kafka事务支持一次精确的处理语义(EOS的含义
  • 支持容错的有状态(当然也包括无状态)处理,包括流连接聚合窗口。换句话说,它支持开箱即用地管理应用程序的处理状态。
  • 支持事件时间处理以及基于处理时间摄取时间的处理。它还无缝处理乱序数据
  • 对流和表均提供一流的支持,这是流处理与数据库相遇的地方;实际上,大多数流处理应用程序都需要流和表两者才能实现其各自的用例,因此,如果流处理技术缺少这两种抽象中的任何一种(例如,不支持表),则您将陷入困境或必须自己手动实现此功能(祝你好运...)
  • 支持交互式查询(也称为“可查询状态”),以将最新的处理结果公开给其他应用程序和服务
  • 更有表现:它附带了(1)功能的编程风格DSL与诸如操作mapfilterreduce以及(2)势在必行风格处理器API用于如做复杂事件处理(CEP),和(3)你甚至可以结合DSL和Processor API。
  • 有自己的测试套件,用于单元和集成测试。

请参阅http://docs.confluent.io/current/streams/introduction.html,以获取有关Kafka Streams API的更详细但更高级的介绍,该介绍还应该有助于您了解与较低级别的Kafka使用者的区别客户。

除了Kafka Streams,您还可以使用事件流数据库ksqlDB在Kafka中处理数据。ksqlDB构建在Kafka Streams之上。它支持与Kafka Streams基本相同的功能,但是您编写的是流式SQL,而不是Java或Scala。您可以通过编程方式通过CLI或REST API与ksqlDB进行交互;如果您不想使用REST,它也具有本机Java客户端。

那么,Kafka Streams API有何不同,因为它也会从Kafka中消费或产生消息?

是的,Kafka Streams API既可以读取数据,也可以将数据写入Kafka。它支持Kafka事务,因此您可以例如从一个或多个主题中阅读一则或多则消息,根据需要选择更新处理状态,然后将一个或多个输出消息写至一个或多个主题-全部作为一个原子操作。

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

是的,您可以编写自己的使用者应用程序-正如我提到的那样,Kafka Streams API本身使用Kafka使用者客户端(加上生产者客户端),但是您必须手动实现Streams API提供的所有独特功能。有关“免费”获得的所有内容,请参见上面的列表。因此,用户选择普通的客户客户端而不是功能更强大的Kafka Streams库是一种罕见的情况。


8
在什么情况下,应用程序将使用Kafka Consumer API而不是Kafka Streams API?
bhh1988 '18

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

1
我认为使他们与众不同的主要因素是访问商店的能力。了解了在流中使用存储的优势之后,您将了解kafka流的功能。
Yonatan Kiron

25

Kafka Stream组件旨在支持ETL类型的消息转换。表示从主题输入流,转换并输出到其他主题的方法。它支持实时处理,同时还支持高级分析功能,例如聚合,开窗,联接等。

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

以下是Kafka Stream上的关键架构功能。请参考这里

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

根据下面的理解,如果有任何遗漏或误导之处,我愿意随时进行更新

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

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

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

在哪里使用Kafka Stream:

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

1
太棒了,确实有帮助,但是有一个主要错误,即消费者和流api中的语义一度可用,而且EOS只是低级消费者/生产者的一堆设置,因此此设置与它们的特定值组合在一起保证EOS行为。目前,我正在将EOS与Consumer api结合使用时没有问题。
uptoyou

是的,我们可以通过设置属性在Kafka Stream中定义一次语义,但是对于简单的生产者和消费者,我们需要定义幂等和事务以支持作为单元事务
sun007

根据建议在措词上做了更改
sun007 '19

@ sun007,对于不需要实时功能的简单应用程序来说速度更快?而且,使用流式传输是否会像其他任何高级工具一样,在kafka本机功能之上增加“额外的”转换开销?
Nag
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.