关于Kafka Producer 的消息丢失,消息重复,消息乱序问题。

一、消息什么时候会丢失?

1.异步导致消息丢失:
kafka的producer默认是异步的方式,在调用send命令时,只是将消息放入一个缓存队列(RecordAccumulator),
同时后台IO线程会不断扫描此缓存队列,将消息封装成batch发送出去。
在这个过程中就会存在一个数据丢失的窗口:
如果在IO线程发送之前producer端挂掉,存放在缓存队列中的数据就会丢失。
解决方法:
既然异步存在数据丢失风险,那改为同步就可以,但要明白同步时效率会变差。
producer.send("topic_name","hello").get()
在send后面增加get调用就变成同步,意思是要get到服务端返回的结果后再往下执行。
方法影响:
producer的吞吐量会下降。
2.unclean leader选举导致消息丢失:
 简单的理解就是不干净的节点,被选举成leader,数据以不干净的节点的准,导致数据丢失。
解决方法:
unclean.leader.election.enable=false,不允许不干净的节点参与leader选举。
方法影响:
unclean节点只有在极端的情况下才会被选为leader,这个极端的情况也就是其它正常的节点都出问题了。
如果这时候unclean不允许参与leader选举,也就没办法进行leader选举,kafka将变成不可用。
所以这个参数,可以理解成是可用性与准确性的选择。
二、消息什么时候会重复?
1.acks为all时leader宕机导致消息重复。
leader写完数据,ISR中的follower也拉取完数据了,但是在返回ack之前,leader宕机了。
此时生产者的没拿到ack(这个请求失败了),就会认为kafka没有拿到数据,就会重发数据。
kafka就又会重新保存这份重发数据,导致数据重复。
解决方法:
新版的kafka加了个幂等性,用参数enable.idempotence=true就可以开启。
开启之后会使用poductorId、partition.id、seqNumber(消息序号,与offset不一样)这三个做缓存,
用于判断重发的数据是否已经被leader以及follower保存过了,如果保存过了,就不会再保存,
这样就避免重复消息了。
方法影响:
只有新版才有,需要升级。
三、消息什么时候会乱序?
1.失败重试导致消息乱序。
假设两条消息发到相同的分区,由于某些原因,如网络抖动,record1没有发送成功,
同时Kafka又配置了重试机制和max.in.flight.requests.per.connection大于1(默认值是5,本来就是大于1的),
那么重试record1成功后,record1在分区中就在record2之后,从而造成消息的乱序。
解决方法:
max.in.flight.requests.per.connection=1限制客户端在单个连接上能够发送的未响应请求的个数,
设置此值是1表示kafka broker在响应请求之前client不能再向同一个broker发送请求。
方法影响:
producer的吞吐量会下降。
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值