文章目录
幂等性
简介
拿http举例来说,一次或多次请求,得到的响应是一致的(网络超时等问题除外),换句话说,就是执行多次操作与执行一次操作的影响是一样的。
如果,某个系统是不具备幂等性的,如果用户重复提交了某个表格,就可能会造成不良影响。例如:用户在浏览器上点击了多次提交订单按钮,会在后台生成多个一模一样的订单。
Kafka生产者幂等性
- 生产消息重复问题
kafka生产者生产消息到partition:默认会将消息保存到分区中,并返回一个ack给生产者,表示当前发送消息的动作是否成功,如果ack响应失败了,此时生产者会再次将上一条消息继续进行发送,此时kafka又会保存一条一模一样的数据。
- 防止重复发送消息:开启kafka的幂等性
- 当生产者生产消息时,会给生产者增加一个pid(生产者唯一编号),再给消息增加一个Sequece number(针对消息的一个递增序列)
- 发送消息时,会将pid和Sequece number一并发送
- partition收到消息,会将pid和Sequece number一并保存下来
- 如果ack响应失败,生产者再次发送消息,partition根据pid、Sequece number是否需要再保存这条消息
- 判断条件:生产者发送过来的Sequece number 是否小于等于partition中的sequece number,如果小于,则不保存,反之则保存
配置幂等性
props.put("enable.idempotence",true);
幂等性原理
为了实现生产者的幂等性,Kafka引入了 Producer ID(PID)和 Sequence Number的概念。
- PID:每个Producer在初始化时,都会分配一个唯一的PID,这个PID对用户来说,是透明的。
- Sequence Number:针对每个生产者(对应PID)发送到指定主题分区的消息都对应一个从0开始递增的Sequence Number。