Kafka 中如何保证消息不丢失、不重复?

1,生产端保障,防止消息投递丢失

Producer将消息发送给Kafka,通过acks控制确认机制。

  • acks=0:不等待任何响应,性能最高,但可能丢消息。
  • acks=1(默认情况):只要Partition Leader成功写入就算成功。
  • acks=all:只有Leader和ISR中的所有副本都成功写入才算成功,最安全。

设置acks=all + min.isync.replicas可以实现强一致性写入。

2,Broken端保障,防止消息存储丢失

Kafka每个Topic的Partition会由多个Broken共同存储。

  • 一个Leader负责写入。
  • 一个或多个Followers同步数据。
  • 正常同步的Followers加入ISR列表。
  • 如果Leader宕机,Kafka会自动从ISR中选出新的Leader,保证服务不中断。

Kafka的一主多从机制+ISR副本选举机制,可以最大程序地避免单点故障造成的数据丢失。

3,消费端保障,防止消息处理丢失、重复消费

默认情况下,消费端使用的是每5秒自动提交offset。这可能会导致以下问题:

  • 业务处理完成,offset没有提交时宕机了,消息会被重复消费。
  • offset提交了,但业务处理失败,宕机后不会再拉取这条消息,处理丢失。

消息重复消费是可以补救的,但是消息丢失不行。

解决方案:

  • 关闭自动提交
  • 手动提交offset:
    • 消息处理完成后再提交offset
    • 推荐做法:业务处理完成后使用commitAsync(),在程序退出时再commitSync()保底。
  • 保证业务幂等:
    • 消息费可能重复拉取消息,因此业务逻辑必须幂等,(使用唯一key,幂等插入,分布式锁等)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值