Kafka:Consumer API vs Streams API

时间:2017-05-17 03:23:56

标签: apache-kafka kafka-consumer-api apache-kafka-streams

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

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

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

  3. 我在这方面做了Google,但没有得到任何好的答案。对不起,如果这个问题太琐碎了。

3 个答案:

答案 0 :(得分:65)

更新2018年4月9日 :现在您还可以使用Kafka的流式SQL引擎KSQL来处理您在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 +)
  • 支持容错状态处理,包括流joinsaggregationswindowing
  • 支持event-time processing以及基于processing-timeingestion-time
  • 的处理
  • streams and tables提供了一流的支持,这是流处理与数据库相遇的地方;实际上,大多数流处理应用程序都需要流和表来实现它们各自的用例,所以如果流处理技术缺少两个抽象中的任何一个(比如说,不支持表),你就会被卡住或必须自己手动实现这个功能(祝你好运...)
  • 支持interactive queries将最新处理结果公开给其他应用程序和服务)
  • 更具表现力:它附带(1)函数式编程样式DSL,其中包含mapfilterreduce等操作以及(2)命令式样式Processor API例如进行复杂事件处理(CEP),以及(3)您甚至可以组合DSL和处理器API。

有关Kafka Streams API的更详细但仍然高级别的介绍,请参阅http://docs.confluent.io/current/streams/introduction.html,这也有助于您了解与较低级别Kafka客户端客户端的差异。还有一个Docker-based tutorial for the Kafka Streams API,本周早些时候I blogged about

  

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

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

  

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

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

答案 1 :(得分:5)

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

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

以下是Kafka Stream上的关键体系结构功能。请参阅here

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

基于下面的理解,我发现有关键差异时,如果有任何遗漏或误导之处,我随时可以进行更新

enter image description here

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

  1. 如果有一个使用者,则消耗消息过程,但不会溢出到其他主题。
  2. 从第1点开始,如果只有生产者在发出消息,我们就不需要Kafka Stream。
  3. 如果消费者消息来自一个Kafka集群,但发布到另一个Kafka集群主题。在那种情况下,您甚至可以使用Kafka Stream,但必须使用单独的Producer才能将消息发布到其他群集。或者只是使用Kafka Consumer-Producer机制。
  4. 批处理-如果需要收集消息或进行某种类型的批处理,则可以使用常规的传统方式很好。

在何处使用Kafka Stream:

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

答案 2 :(得分:0)

Streams 建立在消费者和生产者 API 之上,因此可以在更高的层次上工作,这意味着

  • Streams 更易于用于从主题读取/进程/写入到主题样式的任务
  • 生产者/消费者允许更多的控制,并且可以在 Streams 无法处理的某些情况下使用

例如,Streams 会自动处理事务提交,这意味着您无法控制提交的确切时间点(无论您使用 Streams DSL 还是 Processer API)。相比之下,消费者/生产者 API 为您提供了这种控制。