繁体   English   中英

Kafka:消费者 API 与 Streams API

[英]Kafka: Consumer API vs Streams API

我最近开始学习 Kafka 并最终解决了这些问题。

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

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

我在这方面做了谷歌,但没有得到任何好的答案。 对不起,如果这个问题太微不足道了。

2021 年 1 月更新:我写了一个关于 Kafka 基础知识四部分博客系列,我建议阅读这些问题。 对于这个问题,请查看有关处理基础知识的第 3 部分

2018 年 4 月更新:现在您还可以使用ksqlDB (Kafka 的事件流数据库)来处理 Kafka 中的数据。 ksqlDB 建立在 Kafka 的 Streams API 之上,它也提供一流的 Streams 和 Tables 支持。

消费者 API 和 Streams API 有什么区别?

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

与普通消费者相比,使用 Kafka Streams 编写从头到尾的实际应用程序要简单得多,速度也更快。

以下是 Kafka Streams API 的一些功能,其中大部分功能不受消费者客户端支持(这需要您自己实现缺失的功能,基本上是重新实现 Kafka Streams)。

  • 通过 Kafka 事务支持一次性处理语义( EOS 是什么意思
  • 支持容错有状态(当然也包括无状态)处理,包括流连接聚合窗口 换句话说,它支持开箱即用地管理应用程序的处理状态。
  • 支持事件时间处理以及基于处理时间摄取时间的处理 它还可以无缝处理乱序数据
  • 对流和表都有一流的支持,这是流处理与数据库的结合; 在实践中,大多数流处理应用程序都需要流和表来实现它们各自的用例,所以如果流处理技术缺少这两个抽象中的任何一个(比如,不支持表),你要么被卡住,要么必须自己手动实现这个功能(祝你好运...)
  • 支持交互式查询(也称为“可查询状态”)以通过请求-响应 API 向其他应用程序和服务公开最新的处理结果。 这对于只能执行请求-响应,而不能执行流式处理的传统应用程序尤其有用。
  • 更具表现力:它附带 (1) 具有mapfilterreduce等操作的函数式编程风格DSL以及 (2) 用于执行复杂事件处理 (CEP) 的命令式处理器 API ,以及 (3) 您甚至可以结合 DSL 和 Processor API。
  • 拥有自己的单元和集成测试测试套件

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

除了 Kafka Streams,您还可以使用流数据库ksqlDB来处理 Kafka 中的数据。 ksqlDB 将其存储层 (Kafka) 与其计算层(ksqlDB 本身;这里的大部分功能使用 Kafka Streams)分开。 它支持与 Kafka Streams 基本相同的功能,但您编写流式 SQL 语句而不是 Java 或 Scala 代码。 您可以通过 UI、CLI 和 REST API 与 ksqlDB 交互; 它还有一个本地 Java 客户端,以防您不想使用 REST。 最后,如果您不想自行管理基础设施, ksqlDB 可作为Confluent Cloud 中 的完全托管服务使用。

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

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

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

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

为支持 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. 实现完全一种处理语义和自动定义的容错。

Streams 建立在 Consumer 和 Producer API 之上,因此可以在更高的层次上工作,这意味着

  • Streams 更容易用于从主题读取/处理/写入到主题风格的任务
  • Producer/Consumer 允许更多控制,并且可以在 Streams 无法处理的某些情况下使用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM