kafka生产者数据重复

kafka学习笔记(课程:尚硅谷kafka3.x)

数据重复分析原因

leader接收数据并同步落盘之后挂了,没发应答,然后一个follower成为了新的leader,导致数据重复。

数据传递语义

  • 至少一次:集群至少能收到一次,ACK=-1,分区副本大于等于2,isr大于等于2。
  • 最多一次:ACK=0
  • 精确一次:既不能重复也不能丢失。

幂等性和事物

幂等性

生产者无论向broker发送多少次重复数据,broker都只持久化一条。

重复数据判断标准:pid、partition、SeqNumber
pid:kafka每重启一次都会分配一个新的。
Sequence Number自增
只能保证单会话单分区内不重复。
内存内直接会把重复的数据去掉。

  • 使用方法
    开启参数enable.idempotence。默认为true。false为关闭

生产者事务

开启事务,必须开启幂等性,因为事务底层依赖幂等性。

每一个broker节点都有一个事务协调器,用来处理事务。
使用存储事务的特殊主题来存储。底层还是存在磁盘。
主题有默认50个分区,每个分区处理一部分事务。事务根据事务id(transactional.id,全局唯一)的hashcode%50计算出该事务处于哪个分区。该分区leader所在broker节点即为这个事务id随影的事物协调器节点。

生产者在使用事务功能前,必须先自定义一个唯一的事务id,有了事务id之后,即时客户端挂了,重启后也能继续处理未完成事物。

流程

  1. 生产者向事务协调器请求pid(producer id)
  2. broker返回pid
  3. 生产者发送消息到topic
  4. 生产者发送commit请求
  5. 事务协调器持久化commit请求
  6. 生产者返回成功
  7. 事务协调器后台发送commit请求给leader
  8. leader返回成功给事务协调器
  9. 事务协调器持久化事物成功信息到特殊主题

异常流程

生产者重启后,请求pid,事务协调器检查是否有已提交没完成的事务。如果有,把原来的pid给生产者,然后再发一遍。这种情况下,有重复,就利用幂等性去重。如果没有重复,就落盘,保证可靠性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值