代码之家  ›  专栏  ›  技术社区  ›  Giorgos Myrianthous

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

  •  0
  • Giorgos Myrianthous  · 技术社区  · 8 年前

    我有一个自定义的kafka消费者,在这个消费者中,我用来向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 回复  |  直到 8 年前
        1
  •  1
  •   AbhishekN    8 年前

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

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

        2
  •  1
  •   Mickael Maison    8 年前

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

    因此,即使你没有承诺,一旦你收到记录,消费者的位置就会移动。如果你想重新确认一些记录,你必须改变消费者的当前位置。

    使用Java客户机,您可以使用 seek() 是的。

    在您的场景中,您可能需要计算相对于当前位置的新位置。如果是这样的话,你可以用 position() 是的。