有4个引导服务器,我用下面的代码生成消息
producer.send(new ProducerRecord<>(topic, partitionNumber, key, message, headers),
(metadata, exception) -> {
if (exception == null) {
// the record was successfully sent
synapseLog.auditLog(String.format(SUCCESS_LOG, metadata.offset(),
metadata.partition(), key, messageSeq, topic, SUCCESS));
} else {
synapseLog.auditError(String.format(FAILED_LOG, key, messageSeq,
FAILED, exception.getMessage(), topic, message));
}
}
);
``` `SUCCESS_LOG` 在生成消息时打印,但消费者没有收到消息(有2个消费者具有不同的组id)。'
生产性房地产 `acks = 1` 我试过用不同的组id运行另一个测试消费者。但是它也没有得到消息,可能消息不在kafka中。
这里可能有什么问题。
提前谢谢。
2条答案
按热度按时间7gcisfzg1#
与
acks=1
,在一段时间内丢失信息几乎是不可避免的。这可能是问题的一个原因,但也可能有其他解释——例如,可能以丢失消息的方式编写使用者(例如,在单独的线程中处理消息,并在处理消息之前提交消息)。简言之,1ack的问题是,当您得到成功的响应时,这意味着分区的前导拥有记录,但是跟随者没有,如果前导被重新启动,那么任何没有被代理端的最小insync副本使用的消息都肯定会丢失。这是故意的,
acks=all
更强大,但有一个性能的惩罚,所以Kafka让你选择什么是更重要的-高吞吐量的最低套件或保证交付。我写了一篇关于这个的帖子https://chrisg23.blogspot.com/2020/02/kafka-acks-configuration-apology.html?m=1 它有更多关于正在发生的事情的细节,并且希望是感兴趣的(尽管说实话它有点冗长)
klh5stk12#
我注意到您在producerrecord中指定了分区。我在过去经历过这样的情况:当您生成主题分区,但通过订阅主题而不是订阅分区进行消费时,会出现问题。试着从那个特定的分区消费。您可以通过使用consumer中的assign(collection)方法(来自kafka文档)来“手动分配分区”。