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 并直接写入数据库而不是发送另一个主题

KSQL / KStream - 根据生成时间获取偏移量

有没有一种有效的方法来外部加入几个(超过 2 个)kafka 主题?

使用 kafka lib 反序列化 PRIMITIVE AVRO KEY