当前位置: 首页 > 知识库问答 >
问题:

Spring Kafka 消费者:有没有办法使用 Kafka 0.8 从多个分区读取?

凌俊语
2023-03-14

这是一个场景:我知道,使用与Spring kafka相关的最新API(如Spring集成kafka 2.10),我们可以执行以下操作:

@KafkaListener(id = "id0", topicPartitions = { @TopicPartition(topic = "SpringKafkaTopic", partitions = { "0" }) })

@KafkaListener(id = "id1", topicPartitions = { @TopicPartition(topic = "SpringKafkaTopic", partitions = { "1" }) })

以及来自与相同kafka主题相关的不同分区的读取。

我想知道我们是否可以使用同样的方法,例如spsping-集成-Kafka1.3.1

我没有找到任何关于如何做到这一点的提示(我对xml版本很感兴趣)。

共有2个答案

益麻雀
2023-03-14

这个定义对我帮助最大:

在阿帕奇Kafka中,消费者群体概念是实现两件事的一种方式:

将消费者作为同一消费者群体的一部分意味着提供“竞争消费者”模式,来自主题分区的消息通过该模式在群体成员中传播。每个使用者从一个或多个分区(“自动”分配给它)接收消息,而其他使用者(分配给不同的分区)不会接收到相同的消息。通过这种方式,我们可以将消费者的数量扩展到分区的数量(一个消费者只读取一个分区);在这种情况下,加入组的新用户将处于空闲状态,而不会被分配给任何分区。

将消费者作为不同消费者组的一部分意味着提供“发布/订阅”模式,其中来自主题分区的消息被发送给不同组中的所有消费者。这意味着在同一个消费者群体中,我们会有上面解释的规则,但是在不同的群体中,消费者会收到相同的消息。当不同的应用程序对主题中的消息感兴趣,并以不同的方式处理它们时,这是很有用的。我们希望所有感兴趣的应用程序都能收到来自该主题的相同消息。

从这里开始,不要以错误的方式使用Apache Kafka消费群体!

秦渝
2023-03-14

在Kafka中,你可以决定从哪个主题阅读,但我们不能决定从哪个分区阅读,这取决于Kafka的决定,以避免多次阅读同一条消息。

根据Kafka的定义,消费者不会为了阅读而共享分区。

如果使用者多于分区,则某些使用者将保持空闲状态,并且不会从任何分区使用。例如,如果我们有 5 个使用者和 4 个分区,则 1 个使用者将保持空闲状态,并且不会使用来自 Kafka 代理的数据。

实际的分区分配是由kafka代理(组协调员)和领导者消费者完成的。我们无法控制。

 类似资料:
  • 我相信这三种类型的确认由于生产者属性仅限于领导者和生产者,我希望生产者在消费者通过kafka broker消费来自存储/队列的消息时收到具体的消息。还请纠正我,如果我在制作人的“acks”属性上有错误,它的默认值是“-1”,它确认所有副本是否已接收/存储消息,但它是否与消费者有关,或者我们是否可以在消费者提交且Kafka向制作人发送确认时创建一个桥梁?

  • 我在同一个消费者组上启动了两个消费者,我订阅了20个主题(每个主题只有一个分区) 仅在消费者上使用: kafka消费者组--引导服务器XXXXX:9092--组foo--描述--成员--详细 我做错了什么?

  • 我有一个Kafka系统,看起来像这样(所有消费者都在一个消费者群体中): 在每个消费者中,我轮询消息,然后进行昂贵的计算(从1到60秒)。如果操作成功,我将提交消费者。 在我提交之前,另一个使用者是否会开始处理相同的消息?我需要保证,一旦消息被拾取,它就会被只执行一次 - 除非处理中途失败。

  • 我刚刚注意到,当我在分区中生成单个消息时,我的使用者不会收到它。只有在我在同一分区中生成了更多的消息之后,使用者才会收到它们。我的数设置为 1。 是否有其他一些配置可能会影响这里? 每个分区都有一个专用的消费者。 相关部件的使用者代码。我的使用者为 定义的不同主题启动多个线程。使用 https://github.com/mmustala/rdkafka-ruby 这是原始消费宝石的叉子。我添加了一

  • null 我在这一页上读到以下内容: 使用者从任何单个分区读取,允许您以与消息生成类似的方式扩展消息消耗的吞吐量。 也可以将使用者组织为给定主题的使用者组-组内的每个使用者从唯一分区读取,并且组作为一个整体使用来自整个主题的所有消息。 如果使用者多于分区,则某些使用者将空闲,因为它们没有可从中读取的分区。 如果分区多于使用者,则使用者将从多个分区接收消息。 如果使用者和分区的数量相等,则每个使用者

  • TL;DR;我试图理解一个被分配了多个分区的单个使用者是如何处理reach分区的消费记录的。 例如: 在移动到下一个分区之前,会完全处理一个分区。 每次处理每个分区中的可用记录块。 从第一个可用分区处理一批N条记录 以循环旋转方式处理来自分区的N条记录 我找到了或分配程序的配置,但这只决定了使用者如何分配分区,而不是它如何从分配给它的分区中使用。 我开始深入研究KafkaConsumer源代码,#