卡夫卡: 消费者 API 与流 API

我最近开始学习卡夫卡,并以这些问题告终。

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

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

我谷歌了一下,但没有得到任何好的答案。如果这个问题太琐碎,我很抱歉。

57694 次浏览

更新于2021年1月: 我写了一篇 关于卡夫卡基本原理的四部分博客系列文章,我推荐大家在遇到这样的问题时阅读它。特别是这个问题,看看 第三部分加工基本原理

更新2018年4月 : 现在你也可以使用 KsqlDB,卡夫卡的事件流数据库,用卡夫卡处理你的数据。KsqlDB 构建在 Kafka 的 Streams API 之上,并且它也提供了对 Streams 和 Table 的一流支持。

ConsumerAPI 和 Streams API 有什么区别?

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

与普通消费者相比,用 Kafka Streams 开始编写一个真实世界的应用程序要简单和快速得多。

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

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

有关 Kafka Streams API 的更详细但仍然高级的介绍,请参阅 http://docs.confluent.io/current/streams/introduction.html,这也应该有助于您理解与低级别的 Kafka 消费者客户端之间的差异。

除了卡夫卡流,您还可以使用流数据库 KsqlDB来处理您的数据在卡夫卡。KsqlDB 将其存储层(Kafka)与计算层(ksqlDB 本身; 它在这里使用 Kafka Streams 实现大部分功能)分离开来。它基本上支持与 Kafka Streams 相同的特性,但是您编写的是流式 SQL 语句,而不是 Java 或 Scala 代码。您可以通过 UI、 CLI 和 REST API 与 ksqlDB 交互; 如果您不想使用 REST,它还有一个本机 Java 客户机。最后,如果您不喜欢自我管理您的基础设施,那么可以使用汇流云中的 KsqlDB 可以作为完全管理的服务使用

那么,卡夫卡流 API 有什么不同,因为它也消耗或产生消息给卡夫卡?

是的,卡夫卡流 API 既可以读取数据,也可以写入数据到卡夫卡。它支持卡夫卡事务,因此您可以从一个或多个主题中读取一条或多条消息,如果需要,可以选择更新处理状态,然后将一条或多条输出消息写入一个或多个主题ーー所有操作都是一个原子操作。

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

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

构建 Kafka Stream 组件以支持 ETL 类型的消息转换。方法从主题输入流,转换并输出到其他主题。 它支持实时处理,同时支持高级分析特性,如聚合、窗口、连接等。

“卡夫卡流通过建立在卡夫卡生产者和消费者库的基础上,并利用卡夫卡的本地功能提供资料平行、分布式协调、容错和操作简单性,从而简化了应用程序开发。”

以下是卡夫卡流的主要建筑特色。请参阅 给你

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

基于我下面的理解是关键的差异,我是开放的更新,如果遗漏或误导任何点

enter image description here enter image description here

何处使用消费者-生产者:

  1. 如果有单个使用者,请使用消息流程,但不要转移到其他主题。
  2. 作为第一点,如果只有一个制片人生产信息,我们不需要卡夫卡流。
  3. 如果消费者消息来自一个卡夫卡集群,但发布到不同的卡夫卡集群主题。在这种情况下,您甚至可以使用 Kafka Stream,但必须使用单独的 Producer 将消息发布到不同的集群。或者简单地使用卡夫卡的消费者-生产者机制。
  4. 批处理——如果需要收集消息或进行某种批处理,最好使用常规的传统方法。
  5. 如果您正在寻找更多的控制何时手动提交

在哪里使用卡夫卡流:

  1. 如果您使用来自某个主题的消息,那么转换并发布到其他主题是 Kafka Stream 的最佳选择。
  2. 实时处理、实时分析和机器学习。
  3. 状态转换,如聚合、连接窗口等。
  4. 计划使用当地的国营商店或者像 Portworx 这样的国营商店。
  5. 实现精确一处理语义和自定义容错。

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

  • 流更容易用于主题读取/进程/写入主题样式的任务
  • Producer/Consumer 允许更多的控制,并且可以在 Streams 不处理的某些情况下使用

例如,Streams 会自动处理事务提交,这意味着您无法控制提交的确切时间点(无论您使用 Streams DSL 还是 Processer API)。与此相反,Consumer/Producer API 提供了这种控制。