产生给kafka的消息,但消费者没有收到“一些”消息

时间:2020-06-07 15:34:11

标签: java apache-kafka kafka-consumer-api kafka-producer-api

有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 个答案:

答案 0 :(得分:0)

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

简而言之,带有1 ack的问题是,当您获得成功的响应时,它意味着该分区的领导者具有该记录,但是跟随者没有该记录,并且如果领导者被重新启动,则任何尚未消耗的消息通过代理端的最小异步副本,肯定会丢失。这是有意为之的,acks=all健壮得多,但会降低性能,因此Kafka允许您选择更重要的内容-以最少的试剂盒提供高吞吐量或保证交付。

我在https://chrisg23.blogspot.com/2020/02/kafka-acks-configuration-apology.html?m=1上写了一篇关于此事的帖子,其中详细介绍了正在发生的事情,并希望引起人们的兴趣(尽管说实话,这有点冗长)

答案 1 :(得分:0)

我注意到在ProducerRecord中您已经指定了分区。过去我曾遇到过这样的问题,当您生成主题分区但通过订阅一般主题而不是分区来进行消费时会导致问题。尝试从该特定分区使用。您可以使用Consumer(来自Kafka文档)中的assign(Collection)方法,通过“手动分区分配”来执行此操作。