哪些情况会发生消息丢失
从生产端到消费端都有可能发生消息丢失的情况,也就是在Producer生产者、Broker服务端、Consumer消费者都会发生这个消息丢失
怎么保证消息不丢失
Producer生产者
- 生产者会有自己的应答确认配置acks:acks=0代表无需任何响应,只管发不管发送是否成功,最容易丢失数据,性能最好;acks=1(生产者默认配置)代表服务端leader收到消息无需等副本同步之后立即响应,如果leader挂了就会丢失数据;ack=1代表服务端leader收到消息并且ISR副本收到消息之后再响应,可以保证消息不丢失,但是性能最差。
- 生产者发送失败会有重试机制
Broker服务端
- 消息持久化:Broker服务端收到消息之后会持久化到磁盘,消息会先写入page cache,然后定期刷盘,kafka不支持同步刷盘
- 副本复制机制:副本会从leader复制消息,当leader挂掉之后,会从副本中选出一个新的leader
Consumer消费者
Consumer消费者只可能是消费失败但是仍然提交了offset才会导致消息丢失。可以把消费者的自动提交关闭,手动进行提交。另外对程序进行异常捕获,发生异常可以重试消费或者人工兜底等手段避免消息丢失
网友评论