向 kafka 生成消息,但消费者未收到“某些”消息

Message produced to kafka but consumers does not receive “some” of the messages

有 4 个 bootstrap 服务器,我正在使用以下代码生成消息

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中。

这可能是什么问题。

提前致谢。

对于 acks=1,在一段时间内丢失消息几乎是不可避免的。这是您问题的一个可能原因,尽管可能有其他解释 - 例如,可能会以丢失消息的方式编写消费者(例如,在单独的线程中处理并在处理消息之前提交)。

简而言之,1 ack的问题是,当你得到一个成功的响应时,意味着分区的领导者有记录,但追随者没有,如果领导者重新启动,那么任何没有的消息被代理端的最小同步副本消耗的肯定会丢失。这是有意为之的,acks=all 更健壮,但有性能损失,因此 Kafka 允许您选择更重要的 - 最小套件的高吞吐量或保证交付。

我在 https://chrisg23.blogspot.com/2020/02/kafka-acks-configuration-apology.html?m=1 上写了一个关于这个的 post,其中有更多关于正在发生的事情的细节,希望大家感兴趣(尽管说实话有点啰嗦)

我注意到您在 ProducerRecord 中指定了分区。我过去曾经历过,当您生成主题分区但通常通过订阅主题而不是分区来消费时,这会导致问题。尝试从该特定分区消费。您可以通过 "Manual Partition Assignment" 使用 Consumer 中的 assign(Collection) 方法(来自 Kafka 文档)来做到这一点。