Kafka Kstream 和 Spring @KafkaListener 有何不同?
Posted
技术标签:
【中文标题】Kafka Kstream 和 Spring @KafkaListener 有何不同?【英文标题】:How Kafka Kstream and Spring @KafkaListener are different? 【发布时间】:2018-06-27 11:18:35 【问题描述】:我对 Kafka 和阅读文档有点陌生。 Kafka 办公站点有一个example on KStream。应用程序绑定到主题的位置,一旦消息到达,它就会被处理。结果将发布回主题或数据库。
Spring Kafka 注释 @KafkaListener 具有相同的功能。例如,我尝试了KafaListner application。在这里,我们也会收听一个主题并在发布内容时对其进行处理。
所以我很想知道 1. 这两个有什么不同? 2. 在什么场景下更喜欢哪一个?
【问题讨论】:
Kafka: Consumer API vs Stream API的可能重复 【参考方案1】:请注意,这是一个非常有限的解释。参考文档。
回答您的问题 1“这 2 个有何不同?” - KafkaListener 和 KStream 都使用来自 Kafka 主题的消息。但是,它们在保持状态的方式上有所不同。 KafkaListener 不维护状态。它会在消息到来时使用它。 KStream 将主题读取为连续的消息流。
让我们假设一个主题发送行并且我们维护每个单词的数量。所以在我们发送主题这两行之后,
你好,早上好, 你好谢谢
我们将计算字数 - 你好 2,好 1,早上 1 和谢谢 1。
KakfaListener 可以用来手动保持这个字数。开发人员可以将单词存储在静态 Hashmap 中并保持计数。 KStream 会自然而然地做到这一点,因为它将主题作为流读取 -
它旨在对无限的、无限制的数据流进行操作
KStream 示例详细解释了这一点。
要回答您的问题 2“在哪种情况下更喜欢哪个?”,如果您需要在不维护状态的情况下使用消息,请使用 KafkaListener。就像管道一样,从源到接收器获取信息。如果您的消息彼此相关,请使用 KStream - 例如在所有消息中查找特定单词的总数(大致类似于 SQL 中的 GROUP BY)。
【讨论】:
【参考方案2】:@KafkaListener
未使用 KStream
(流 API)。 @KafkaListener
是来自 spring-kafka
的注解,它在内部使用 Consumer API。 KStream
在 Consumer API 中不可用,在 Stream API 中可用。
有关 Stream API 和 Consumer API 之间的区别,请查看评论中链接到您的问题的问题。记住一件事,spring-kafka
库封装了 Kafka 库,所以你有四个 API 可用:spring-kafka
封装的 Stream API,spring-kafka
封装的 Consumer API,Stream API 和 Consumer API。您提到的两个示例是:spring-kafka
包装的 Stream API 和 Consumer API。
【讨论】:
KStream 在 Consumer API 中不可用,它在 Stream API 中可用。 没错,因为 KStream 构建在 Consumer 和 Producer API 之上。另请参阅此处以了解消费者 API 和流 API 之间的区别:***.com/questions/44014975/… 在这种情况下,Spring 的 KafkaListener 将进入 Streams API 所做的相同方向,并将在消费者 API 的基础上构建一个配置库的约定来处理 Kafka 消息以上是关于Kafka Kstream 和 Spring @KafkaListener 有何不同?的主要内容,如果未能解决你的问题,请参考以下文章
去重 KStream-KStream 的中间结果加入 Kafka Streams
Kafka Streams API:KStream 到 KTable
如何处理 kafka KStream 并直接写入数据库而不是发送另一个主题