明确可能丢消息的三个阶段:
1.生产者发送消息到broker之间的过程可能会产生数据丢失
(rockerMQ)解决方案:可以采用同步的方式来send发送一个成功的状态,如果成功就表示broker就已经成功接收到了生产者发来的消息,并存储在broker了,如果send消息异常或者非成功返回状态,那么就要生产者就要进行在次发送。
(rabbitmq) 解决方案:使用生产者发送消息确认机制,每当生产者发送mq服务时,监听一个confirmlistener,触发回调状态,根据返回状态进行后续操作。
2.broker储存消息阶段会导致数据丢失
(rockermq同步刷盘)解决方案,写入消息之后,立即通知线程刷盘,返回成功状态
(rockermq异步刷盘)解决方案,消息队列到一定数量之后,写入broker,通知线程刷盘,断电会导致数据丢失
(rockermq集群同步复制)解决方案,主从节点均复制成功,返回成功状态,如果主节点失败了,从节点保存的数据就会复制到主节点上,但会产生大量的延迟,降低了吞吐量。
(rockermq集群的异步复制)解决方案,只要主节点复制成功,就会返回成功状态,但如果主节点损坏,由于从节点没有复制,就会导致了数据丢失
(rabbitmq持久化)消息写入之后,就会持久化到磁盘中,损坏后回复,就会写入磁盘的数据
3.broker发送消息到消费者阶段会导致数据丢失
(采用消费者手动确认消息机制)消费者执行完业务逻辑,返回给ack成功表示给broker,告诉他,我已经消费成功了