0%

RabbitMQ-应用问题

如何保证消息不丢失

消息丢失场景

生产者消息丢失

问题

  • 外界环境问题导致:发生网络丢包、网络故障等造成RabbitMQ Server端收不到消息,因为生产环境的网络是很复杂的,网络抖动,丢包现象很常见
    • 一般情况下,生产者使用Confirm模式投递消息,如果方案不够严谨,比如RabbitMQ Server 接收消息失败后会发送nack消息通知生产者,生产者监听消息失败或者没做任何事情,消息存在丢失风险;
  • 代码层面,配置层面,考虑不全导致消息丢失
    • 生产者发送消息到exchange后,发送的路由和queue没有绑定,消息会存在丢失情况,下面会讲到具体的例子,保证意外情况的发生,即使发生,也在可控范围内。

MQ存储的消息丢失或可靠性不足

  • 消息未完全持久化,当机器重启后,消息会全部丢失,甚至Queue也不见了
  • 单节点模式问题,如果某个节点挂了,消息就不能用了,业务可能瘫痪,只能等待
    • 如果做了消息持久化方案,消息会持久化硬盘,机器重启后消息不会丢失;但是还有一个极端情况,这台服务器磁盘突然坏了(公司遇到过磁盘问题还是很多的),消息持久化不了,非高可用状态,这个模式生产环境慎重考虑。
  • 普通集群模式:某个节点挂了,该节点上的消息不能用,有影响的业务瘫痪,只能等待节点恢复重启可用(建立在消息持久化)
    • RabbitMQ 集群模式有点特殊,队列的内容仅仅存在某一个节点上面,不会存在所有节点上面,所有节点仅仅存放消息结构和元数据
  • 镜像模式:可以解决上面的问题,但是还是有意外情况发生
    • 比如:持久化的消息,保存到硬盘过程中,当前队列节点挂了,存储节点硬盘又坏了,消息丢了,怎么办?

消费者消息丢失

消费端接收到相关消息之后,消费端还没来得及处理消息,消费端机器就宕机了,此时消息如果处理不当会有丢失风险

如何避免消息丢失?

下面也是从三个方面介绍:
1.生产者消息如何不丢
2.MQ中存储的消息如何保证
3.消费者消息如何不丢

消息幂等性