代码之家  ›  专栏  ›  技术社区  ›  rayman

在卡夫卡中批量消费时如何部分提交同步

  •  1
  • rayman  · 技术社区  · 7 年前

    我们正在与卡夫卡合作。我们使用X条消息,将它们放到MYSQL上,然后提交它们。

    有时我们会部分插入MYSQL(重复记录、其他故障等)

    使用文档中的示例:

    List<ConsumerRecord<String, String>> buffer = new ArrayList<>();
        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(100);
            for (ConsumerRecord<String, String> record : records) {
                buffer.add(record);
            }
            if (buffer.size() >= minBatchSize) {
                insertIntoDb(buffer);
                consumer.commitSync();
                buffer.clear();
            }
    

    我们只想提交成功的记录,而让卡夫卡重播失败的记录。

    但我不明白该怎么做,因为api在整个批处理中只有commitSync()。

    思想?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Mickael Maison    7 年前

    在卡夫卡中,您不提交特定记录,即不能将偏移量N标记为已处理,将偏移量N-1标记为未处理。相反,通过提交偏移量N,表示您已经处理了N之前的所有记录。

    无法处理偏移量N时可以执行的操作:

    • 提交N-1(使用 commitSync(java.util.Map<TopicPartition,OffsetAndMetadata> offsets) )然后重试处理偏移量N,因为它仍在内存中。只有在N成功完成处理后,您才能提交N并移动到较新的记录。

    • 假设您在Kafka Connect的接收器连接器中运行,在处理N失败时,您可以将记录转发到Connect的交易信函队列。否则,请将其推回到另一个主题,以便稍后处理。这会暂时跳过偏移量N(如果可以,也可以删除它)。

    您也可以混合使用这两种方法,尝试几次重试,但如果无法处理此记录,请保存/删除它并继续处理较新的记录。