八、Kafka-幂等

ps : kafka幂等是针对producer来说的

注意幂等设计只能保证单个 Producer 对于同一个Partition的Exactly Once语义

1、消息语义

  • At most once : 消息可能会丢失,但不会重复
  • At least once : 消息不会丢失,但可能重复
  • Exactly once : 正好一次。消息不会丢失也不会重复

2、为什么需要幂等?

  • 在0.11.0.0之前,如果producer未能收到已提交消息的response,除了重新发送消息外别无选择,但提供了至少一次的语义保证。即原始请求已经成功,但因为某些原因(网络抖动、超时等问题),导致producer没有收到broker返回的数据ack,则producer会继续重试发送消息,从而导致消息重复发送。
  • 从0.11.0.0开始,kafka producer支持幂等选项,该选项保证重新发送不会导致日志中出现重复条目
  • 从0.11.0.0开始,kafka支持类似于将消息发送到多个分区的事务能力。即所有消息要么全部成功写入,要么都不成功。

3、幂等实现原理

  • 引入了ProducerId(即PID)和Sequence Number
    • ProducerID:初始化过程中,Broker会为每个生产者分配一个唯一的PID,该PID对用户完全透明的
    • Sequence Number:每个对应PID的Producer发送数据时每条消息都对应一个从0 开始单调递增的序号
  • broker端也会为每个<pid, topic, partitionId>维护一个序号,并且每次提交一条消息都会将序号递增。对于接收的消息,如果其序号比broker维护的序号(最后一次提交的消息编号)大1,则broker会接受它,否则将其丢弃:
    • 如果消息序号比 Broker 维护的序号大于等于2,说明中间有数据尚未写入,也即乱序,此时 Broker 拒绝该消息,Producer 抛出OutofSequenceNumber
    • 如果消息序号小于等于 Broker 维护的序号,说明该消息已被保存,即为重复消息,Broker 直接丢弃该消息,Producer 抛出DuplicateSequenceException

在这里插入图片描述

4、代码

props.put("enable.idempotence",true);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值