繁体   English   中英

Kafka事务提交超时异常处理

[英]Kafka transaction commit timeout exception handling

我正在大规模运行 kafka 事务,下面是代码片段。

producer.initTransaction();
try {
    producer.beginTransaction();
    producer.send(new ProducerRecord<>(producerTopic, element));
    producer.commitTransaction();
} catch (ProducerFencedException | OutOfOrderSequenceException | AuthorizationException e) {
    producer.close();
    canSendNext = false;
}catch (KafkaException e) {
    producer.abortTransaction();
}

使用的属性:

ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, STRING_SERIALIZER ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, BYTE_ARRAY_SERIALIZER ProducerConfig.TRANSACTIONAL_ID_CONFIG, UUID.randomUUID().toString() bootstrap.servers=localhost:9092 acks=all retries=1 partitioner.class=org.apache.kafka.clients.producer.循环分区器

当 commitTransaction 超时时,KafkaException 的 catch 块运行并尝试中止事务。 失败并显示错误:** 无法尝试操作abortTransaction因为之前对commitTransaction的调用超时并且必须重试**

如何处理提交事务超时场景

期待代码工作

根据文档

请注意,如果事务无法在 max.block.ms 到期之前提交,则此方法将引发 TimeoutException。 此外,如果被中断,它将引发 InterruptException。 在任何一种情况下重试都是安全的,但不可能尝试不同的操作(例如 abortTransaction),因为提交可能已经在完成过程中。 如果不重试,唯一的选择是关闭生产者。

这里的问题是kafka producer超时了,不知道kafka broker是否会完成交易。 因此它不能为您提供中止交易功能,因为即使在生产者超时后,交易也有可能由经纪人提交。

您应该为您的 kafka 生产者配置足够大的max.block.ms和足够多的retries来处理这种情况(不确定为什么将重试次数配置为 1)。 理想情况下,你应该很少超时——比如当 .network 中出现问题或者 kafka 代理中出现一些实际问题时。

在这种情况下,您将无法知道上次交易是否真的成功。 你只能关闭你的 kafka 生产者并创建一个新的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM