java—生成给kafka的消息,但消费者不会收到“部分”消息

neskvpey  于 2021-06-05  发布在  Kafka
关注(0)|答案(2)|浏览(477)

有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中。
这里可能有什么问题。
提前谢谢。
7gcisfzg

7gcisfzg1#

acks=1 ,在一段时间内丢失信息几乎是不可避免的。这可能是问题的一个原因,但也可能有其他解释——例如,可能以丢失消息的方式编写使用者(例如,在单独的线程中处理消息,并在处理消息之前提交消息)。
简言之,1ack的问题是,当您得到成功的响应时,这意味着分区的前导拥有记录,但是跟随者没有,如果前导被重新启动,那么任何没有被代理端的最小insync副本使用的消息都肯定会丢失。这是故意的, acks=all 更强大,但有一个性能的惩罚,所以Kafka让你选择什么是更重要的-高吞吐量的最低套件或保证交付。
我写了一篇关于这个的帖子https://chrisg23.blogspot.com/2020/02/kafka-acks-configuration-apology.html?m=1 它有更多关于正在发生的事情的细节,并且希望是感兴趣的(尽管说实话它有点冗长)

klh5stk1

klh5stk12#

我注意到您在producerrecord中指定了分区。我在过去经历过这样的情况:当您生成主题分区,但通过订阅主题而不是订阅分区进行消费时,会出现问题。试着从那个特定的分区消费。您可以通过使用consumer中的assign(collection)方法(来自kafka文档)来“手动分配分区”。

相关问题