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,幂等插入,分布式锁等)