我使用的是Kafka Producer,我的应用程序将具有相同密钥的各个ProducerRecord发送到单个分区,然后将这些ProducerRecord批处理(使用batch.size和linger.ms参数),然后再发送给代理。我有enable.idempotence = true和acks = all。
如果批处理中间的一条记录无法写入,例如主机崩溃或网络故障或磁盘故障,或者该记录未能被最小副本确认,Kafka是否保证所有后续记录还会不会写?还是有可能丢失批次中间的记录?
答案 0 :(得分:1)
由于所有记录都将移至同一个分区,因此可以放心地假设所有先前的记录也都将位于该分区。
Kafka保证在给定分区中排序,因此,如果将消息m1和m2(按顺序)发送到该分区,则批处理和延迟逻辑将不覆盖该排序。换句话说,如果您在消费者处看到消息m2,则可以放心地假设m1也已安全发送。
答案 1 :(得分:1)
如果批处理中间的一条记录无法写入,例如主机崩溃或网络故障或磁盘故障,或者该记录未能被最小副本确认,Kafka是否保证所有后续记录也不会写?
是的,如果批处理中的 any 消息失败,则同一批处理中的所有消息都将失败。因此,该批处理中的所有消息都不会写入代理的磁盘。
或者是否有可能丢失批次中间的记录?
否,该批次的全部或全部消息都不会写入代理。
这是通过在生产者客户端线程和本地缓冲区之间进行分隔来实现的,该缓冲区在将数据物理发送到代理之前将数据排队并进行批处理。