Apache flink FlinkKafkaProducer的ProducerConfig具有精确的一次语义

Apache flink FlinkKafkaProducer的ProducerConfig具有精确的一次语义,apache-flink,flink-streaming,Apache Flink,Flink Streaming,当使用Kafka API创建具有一次语义的Kafka生产者时,必须设置两个属性:transactional.id必须设置为事务id,并且enable.idemptence必须设置为true 在Apache Flink中,FlinkKafkaProducer可以配置一个参数,用于生成程序所需的语义,特别是值语义 查看FlinkKafkaProducer的源代码,事务ID是自动生成和维护的。但是,对于基础KafkaProducer的ProducerConfig,我没有找到任何地方将enable.id

当使用Kafka API创建具有一次语义的Kafka生产者时,必须设置两个属性:
transactional.id
必须设置为事务id,并且
enable.idemptence
必须设置为true

在Apache Flink中,
FlinkKafkaProducer
可以配置一个参数,用于生成程序所需的语义,特别是值
语义

查看FlinkKafkaProducer的源代码,事务ID是自动生成和维护的。但是,对于基础
KafkaProducer
ProducerConfig
,我没有找到任何地方将
enable.idemptence
设置为true


属性
是否启用。幂等性
必须在
ProducerConfig
中提供给
FlinkKafkaProducer
,或者是否有我监督过的内容?

不需要按照以下说明进行设置:

如果设置了transactional.id,则幂等性将自动启用,同时生产者将配置幂等性所依赖的

正如您所注意到的,在选择了
Semantics.ONCE之后,Flink恰好负责设置和控制
transactional.id
属性


不过,您可能会对一些其他属性感兴趣。我不知道现在情况如何,但正如我上次检查默认Kafka brokers/clients配置时所说,在某些情况下,实际上允许发生数据丢失

如何重写
transaction.id
属性?您不能。请记住,Flink并没有使用单一的
transactional.id
,但是
FlinkKafkaProducer的每个并行实例都使用自己的池。我认为默认情况下,池的大小是5。例如,如果并行度为12,则单个作业将使用60
transactional.id
。您还可以在这里查看:ty以了解更多信息。幸运的是,在我通过ssl证书的情况下,
transaction.id
前缀就足够了。Flink正在使用task name+uid作为kafka生产者事务id前缀