我们正在批量使用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()。
想法?
答案 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(如果可以的话,也可以将其删除)。
您也可以将两者混合使用,尝试重试几次,但是如果无法处理该记录,请保存/删除并继续处理较新的记录。