「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战」。
6. Kafka生产者幂等性与事务
6.1 幂等性
6.1.1 简介
拿http举例来说,一次或多次请求,得到地响应是一致的(网络超时等问题除外),换句话说,就是执行多次操作与执行一次操作的影响是一样的。
如果,某个系统是不具备幂等性的,如果用户重复提交了某个表格,就可能会造成不良影响。例如:用户在浏览器上点击了多次提交订单按钮,会在后台生成多个一模一样的订单。
6.1.2 Kafka生产者幂等性
在生产者生产消息时,如果出现retry时,有可能会一条消息被发送了多次,如果Kafka不具备幂等性的,就有可能会在partition中保存多条一模一样的消息。
6.1.3 配置幂等性
**props**.put( **"** **enable.idempotence** **"** ,true);
6.1.4 幂等性原理
为了实现生产者的幂等性,Kafka引入了 Producer ID(PID)和 Sequence Number的概念。
-
PID:每个Producer在初始化时,都会分配一个唯一的PID,这个PID对用户来说,是透明的。
-
Sequence Number:针对每个生产者(对应PID)发送到指定主题分区的消息都对应一个从0开始递增的Sequence Number。
6.2 Kafka事务
6.2.1 简介
Kafka事务是2017年Kafka 0.11.0.0引入的新特性。类似于数据库的事务。Kafka事务指的是生产者生产消息以及消费者提交offset的操作可以在一个原子操作中,要么都成功,要么都失败。尤其是在生产者、消费者并存时,事务的保障尤其重要。(consumer-transform-producer模式)
6.2.2 事务操作API
Producer接口中定义了以下5个事务相关方法:
-
initTransactions(初始化事务):要使用Kafka事务,必须先进行初始化操作
-
beginTransaction(开始事务):启动一个Kafka事务
-
sendOffsetsToTransaction(提交偏移量):批量地将分区对应的offset发送到事务中,方便后续一块提交
-
commitTransaction(提交事务):提交事务
-
abortTransaction(放弃事务):取消事务