rabbitmq消息可靠性

消息丢失场景

消息从生产者写入到消息队列的过程

问题原因
网络抖动

解决办法

  • 事务
    在生产者发送消息之前,通过channel.txSelect开启一个事务,接着发送消息, 如果消息投递失败,进行事务回滚channel.txRollback,然后重新发送, 如果消息投递成功,就提交事务channel.txCommit。
    缺点:同步操作。生产者吞吐量大大降低。

  • 发布者确认
    一旦消息被投递到所有匹配的队列之后,RabbitMQ就会发送一个确认(Basic.Ack)给生产者(包含消息的唯一deliveryTag和multiple参数),这就使得生产者知晓消息已经正确到达了目的地。

  • 其他
  1. 使用mandatory 设置true:不可路由消息回发到生产者
  2. 利用备份交换机(alternate-exchange):处理无法路由到队列的消息

消息在消息队列中的存储场景

问题原因

  • 持久化了Message,没有持久化队列
  • 唯一的磁盘节点宕机

解决办法
1、消息持久化+队列持久化
消息设置delivery-mode为2,队列设置为durable

2、使用HA队列
发布者发送消息到集群中的任何节点。RabbitMQ节点同步队列中消息的状态。发布的消息被放入队列,并存储在每台服务器上。

3、集群设置>=1的磁盘节点。
磁盘节点保存集群的运行时状态。确保有多个磁盘节点,保证故障场景下的可靠性。集群恢复时,需要注意磁盘节点的启动顺序。

消息被消费者消费的过程

问题原因:错误代码
解决办法
1、使用消费者手动确认消费
2、消费者程序使用事务提交和回滚批量操作。


   转载规则


《rabbitmq消息可靠性》 wangyixin-tom 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
redis缓存 redis缓存
redis缓存使用 应用读取数据时,需要先读取 Redis; 发生缓存缺失时,需要从数据库读取数据并更新缓存。 Redis为旁路缓存,因为读取缓存、读取数据库和更新缓存的操作都需要在应用程序中来完成。 缓存分类 只读缓存:加速读请求。
2020-10-27
下一篇 
rabbitmq消息重复 rabbitmq消息重复
场景 可靠性投递机制:mq收到生产者消息,mq在返回confirm的时候网络出现闪断,导致broker未收到应答,导致发送两次。 MQ Broker服务与消费端传输消息的过程中出现网络抖动。 消费端故障、异常。 解决方案可靠性投递解决对每
2020-10-26
  目录