在kafka中使用批处理时如何部分commitSync

时间:2018-11-26 09:59:38

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

我们正在批量使用kafka。我们消耗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();
        }

我们只想提交成功的记录,同时让kafka重播失败的记录。

但是我无法理解如何执行此操作,因为整个批次中api仅具有commitSync()。

想法?

1 个答案:

答案 0 :(得分:2)

在Kafka中,您不提交特定记录,即,您不能将偏移量N标记为已处理,而将偏移量N-1标记为未处理。而是通过提交偏移量N来表示您已处理所有记录,直到N。

无法处理偏移量N时可以做的事情:

  • 提交N-1(使用commitSync(java.util.Map<TopicPartition,OffsetAndMetadata> offsets)),并在内存中仍保留偏移量N时重试。仅在成功处理完N之后,您才提交N并移至较新的记录。

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

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