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、消费者程序使用事务提交和回滚批量操作。

posted on 2020-10-17 15:39  hainingwyx  阅读(117)  评论(0)    收藏  举报

导航