如果您的消费者少于分区,这是否意味着您不会消耗给定主题的所有消息?
在云环境中,您认为如何跟踪有多少消费者正在运行以及有多少消费者指向给定的主题#cage?
如果您在给定主题#cage上有多个消费者,该怎么办?我想消费者必须以某种方式跟踪它在重复的情况下已处理的消息?
在试图深入了解 Kafka 分发模型时,StackOverflow 的一句话让我兴奋不已,我无法得到确认或否认。
因此,订阅者组越多,性能就越低,因为 kafka 需要将消息复制到所有这些组并保证总顺序。
据我从 Kafka 文档中了解到,多个消费者组的行为与单个消费者类似。代理内不会进行复制,因为每个消费者对于某个分区都有自己的偏移量。那么,组的数量不应产生任何显着的开销,所有数据都位于一个位置,只是偏移量不同。那是对的吗?
如果这是正确的,那么实际上无法在不影响吞吐量的情况下引入多个不相交的消费者,因为所有消费者总是查询所有分区,并且引入了某种复制。请注意,这与消费者线程的数量无关,线程只会提高消费者性能,据我所知,它们不会干扰代理操作。
message-queue publish-subscribe bigdata messagebroker apache-kafka
我正在为我们的应用程序实现基于Kafka的解决方案.根据Kafka文档,我理解的是消费者组中的一个消费者(这是一个线程)内部映射到订阅主题中的一个分区.
假设我有一个包含40个分区的主题,并且我有一个在4个实例中运行的高级消费者.我不希望一个实例使用另一个实例消耗的相同消息.但是如果一个实例发生故障,其他三个实例应该能够处理所有消息.
在Apache Kafka中,为什么不能有比分区更多的消费者实例?
使用简单的使用者或低级别的使用者可以控制分区,但是如果一个实例关闭,其他三个实例将不会处理来自第一个实例中使用的分区的消息
注意重复标记:我确实检查了其他问题,但它没有回答我下面的具体问题。
想象一下,我在一台只有一个分区的服务器上有一个 Kafka 主题。所以它与队列非常相似。
现在假设我想要 100 个侦听器等待接受队列中的值。因此,根据设计,如果所有 100 个消费者都在一个组中,则日志(或此处的队列)中的内容将在消费者之间分发。所以操作会在1/100的时间内结束。
问题是Spring Kafka监听器只配置了主题名称。
@Service
public class Consumer {
@KafkaListener(topics = "${app.topic}")
public void receive(@Payload String message,
@Headers MessageHeaders headers) {
System.out.println("Received message="+message);
headers.keySet().forEach(key -> System.out.println(key+"->"+headers.get(key)));
}
}
Run Code Online (Sandbox Code Playgroud)
我似乎可以让 Kafka 产生 100 个消费者来处理来自“队列”(日志)的消息。如何做呢?
有一个基本示例,它对 1 个消费者来说就像一个魅力。它接收消息。但是添加一个额外的消费者将被忽略。
let kafka = require('kafka-node');
let client = new kafka.Client();
let producer = new kafka.Producer(client);
let consumer1 = new kafka.Consumer(client,[ {topic: 'topic1', partition: 0}]);
let consumer2 = new kafka.Consumer(client,[ {topic: 'topic2', partition: 0}]);
producer.on('ready', function () {
producer.send([{topic:'topic1', messages: 'topic 1 msg' ], (err,data)=>{
console.log(err,'1 sent');
});
producer.send([{topic:'topic2', messages: 'topic 1 msg'}], (err,data)=>{
console.log(err, '2 sent');
});
});
producer.on('error', function (err) {
console.log('err', err);
})
consumer1.on('message',(message) =>{
console.log(11, message);
});
consumer2.on('message',(message) =>{
console.log(22, message);
})
Run Code Online (Sandbox Code Playgroud)
消费者2的'22'事件永远不会触发的问题。如果我使用命令行工具检查该主题的数据存在