1、发送方 为保证消息到达exchange,在这个过程中不丢失。 用事务或者发送方确认机制 见《RabbitMQ实战指南》4.8节
2、为保证消息不会因为到达exchange后,无法路由到任何一个队列而丢失
解决方案一:发送方发送消息时 令mandatory参数=true,用ReturnListener异步接收没有任何队列接收而返回给发送方的消息。 见《RabbitMQ实战指南》4.1.1节
解决方案二:给exchange指定一个备份交换器及对应队列,到达交换器的消息如何无法路由到任何队列,就路由到备份交换器及对应的队列上 见《RabbitMQ实战指南》4.1.3节
3、为防止队列中消息被丢弃:
情况一 消费消息设置了手动确认模式,被消费的消息被消费端拒绝,而且设置requeue=false,消息被丢弃
情况二 有过期时间的消息或者设置了过期时间的队列,在到达过期时间后,消息被丢弃
情况三 队列达到最大长度
解决方案:设置死信队列,接收被丢弃的队列 见《RabbitMQ实战指南》4.3节
4、为防止由于服务器重启,导致队列中消息丢失。 使用持久化 见《RabbitMQ实战指南》 4.4节
5、为防止消息端在消息消息的过程中,消息丢失
消息端设置手动确认收到消息 见《RabbitMQ实战指南》3.5节
6、以上情况,都是基于RabbitMQ节点,不会出现故障的解决方案。
为应对节点故障,1、建立RabbitMQ集群。保证节点故障时,其他节点可以正常使用。
唯一丢失的是故障节点的队列及队列上的消息,exchange与此队列的绑定,消费端与此队列的绑定 见《RabbitMQ实战指南》7.1节
2、为应对上面这种情况,设置 镜像队列 见《RabbitMQ实战指南》 9.4节