Kafka简历使用者无法收到第一条消息

时间:2019-08-28 16:39:51

标签: apache-kafka spring-cloud-stream

我需要暂停Kafka使用者从主题中获取消息,直到消息到达其等待时间为止。为此,我在Kafka中使用了暂停/恢复方法。但是当我恢复时,暂停前消耗的第一条消息将不会再收到。但是,由于我进行了手动确认,因此该主题的偏移量尚未更新(滞后为1)。

@StreamListener(ChannelName.MESSAGE_INPUT_RETRY_CHANNEL)
public void onMessageRetryReceive(org.springframework.messaging.Message<Message> message, @Header(KafkaHeaders.CONSUMER)KafkaConsumer<?,?> consumer){

    long waitTime = //Calculate the wait time of the message
    Acknowledgment acknowledgment = message.getHeaders().get(KafkaHeaders.ACKNOWLEDGMENT, Acknowledgment.class);
    if(waitTime > 0){
        consumer.pause(Collections.singleton(new TopicPartition("message-retry-topic",0)));
    }else{
        messageProducer.sendMessage(message.getPayload());
        acknowledgment.acknowledge();
    }
}


@Bean
public ApplicationListener<ListenerContainerIdleEvent> idleListener() {
    return event -> {
        boolean isReady = //Logi to check if ready to resume
        if(isReady){
            event.getConsumer().resume(event.getConsumer().paused());
        }
    };
}

这与KafkaConsumer resume partition cannot continue to receive uncommitted messages中提到的问题有关。但是我不确定seeks方法如何有助于检索第一个消耗的消息。我正在使用春季云流。我需要一些建议

1 个答案:

答案 0 :(得分:1)

您没有调用acknowledgment.acknowledge();的事实,并不意味着您的KafkaConsumer实例没有将最后消耗的位置保留在内存中。

我们肯定需要为分区上的后续使用者提交偏移量。当前运行的消费者不需要提交此类信息,因为它处于自己的内存状态。

要重新使用同一记录,您需要执行seek()操作。 有关更多信息,请参阅文档:https://docs.spring.io/spring-kafka/docs/current/reference/html/#seek