- 生产者将消息发送给mq途中,因出现网络抖动,导致消息丢失
- 消息存储在pagecache区,且尚未触发异步刷盘,而出现断电一类,导致数据丢失。或是存入磁盘后,磁盘损坏导致数据丢失
- Consumer从mq中拿取数据,尚未完成消费,就通知mq消费完毕,然后消费者宕机,导致消息丢失
解决方案
场景一:
- 基于生产者的分布式事务来解决
- 若是消息推送mq过程中丢失,则执行回滚操作
- 生产者发送完消息以后,mq即使接收到响应成功后,暂时消费者也不会消费的(此时处于半消息状态)
- 生产者会执行自己的链路,若是执行完毕且成功,会再次通知mq将消息commit(二次确认机制),否则进行rollback操作
场景二:
将异步刷盘改为同步刷盘,同时对于broker进行集群化部署,进行主从复制策略
场景三:
- mq会在消费端注册一个监听,当consumer拿去到消息消费时,只有消费成功后,才会发送一个COMSUME_SUCCESS的状态,mq会知道消费成功(类似与一个ACK的确认机制)
- 当节点挂掉时,rocketmq长时间收不到响应(监听也没了),就会进行故障转移,将消息发给其他消费者处理