丢失的3种情况:
1.生产者在发送给MQ时因网络问题或其他问题丢失。
2.MQ暂存,后还没消费,就挂掉,导致丢失。
3.消费者没来得及处理,就挂了,MQ还以为已经消费了。
解决方法:
1.生产者:a. 开启rabbitMQ事务同步,造成阻塞,耗性能,不推荐。
b.开启confirm机制,异步,生成消息时会生成一个唯一的ID,mq收到消息后回传一个ack ,告诉生产者消息处理成功。如果失败,回调nack接口。超时,生产者重发。
2.rabbitMQ: 开启消息持久化。
消息补偿机制:生产端首先将业务数据以及消息数据入库,需要在同一个事务中,消息数据入库失败,则整体回滚。
根据消息表中消息状态,失败则进行消息补偿措施,重新发送消息处理
3.消费者关闭自动ACK确认机制
使用rabbitmq提供的ack机制,服务端首先关闭rabbitmq的自动ack,然后每次在确保处理完这个消息之后,在代码里手动调用ack。这样就可以避免消息还没有处理完就ack。
这样就解决了,即使一个消费者出了问题,但不会同步消息给服务端,会有其他的消费端去消费,保证了消息不丢的case。
http://t.csdn.cn/Xj8BM