重新使用未提交偏移量的消息

时间:2018-06-26 10:29:43

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

我有一个自定义的Kafka Consumer,用于将一些请求发送到REST API。 根据API的响应,我要么提交偏移量,要么跳过不提交的消息。

最小示例:

while (true) {

    ConsumerRecords<String, Object> records = consumer.poll(200);
    for (ConsumerRecord<String, Object> record : records) {

        // Sending a POST request and retrieving the answer
        // ...

        if (responseCode.startsWith("2")) {
            try { 
               consumer.commitSync();
            } catch(CommitFailedException ex) {
              ex.printStackTrace(); 
            }
        } else {
              // Do Nothing
        }
    }
}

现在,当REST API的响应未以2开头时,不会提交偏移量,但是不会重新使用该消息。如何强制使用者重新使用未提交的偏移量的邮件?

2 个答案:

答案 0 :(得分:1)

提交偏移量只是存储使用者当前偏移量(也称为位置)的一种方法。因此,如果它停止了,它(或新的使用者实例将接管)可以找到其先前的位置并从那里重新开始消费。

因此,即使您不提交,一旦收到记录,消费者的头寸也会移动。如果要重新使用某些记录,则必须更改使用者的当前位置。

使用Java客户端,您可以使用seek()来设置位置。

在您的方案中,您可能想计算相对于当前头寸的新头寸。如果是这样,您可以使用position()查找当前位置。

答案 1 :(得分:1)

如果您打算使用seek(),请确保您的数据是幂等的。由于您有选择地提交偏移量,因此遗漏的记录可能会在提交(成功处理)记录之前进行。如果您执行seek()-将groupId的指针移动到未提交的偏移量并开始重播,那么您还将获得那些成功处理的消息。它还有可能成为无限循环。

或者,您可以将失败记录的元数据保存在内存或数据库中,并从“ poll(retention.ms)”开始重播主题,以便重播所有记录,但添加过滤器以仅处理那些元数据与之匹配的API您之前保存的内容。每小时或每小时进行一次批处理。

相关问题