走过路过不如看过--RabbitMq如何防止消息丢失?

494 阅读1分钟

RabbitMq如何防止消息丢失?

生产者丢失

①开启事务机制,但是性能不是很高

image.png

②开启异步confirm机制,性能最高

image.png

image.png

RabbitMq丢失

设置RabbitMq持久化,有两个步骤:

  • 创建 queue 的时候将其设置为持久化 这样就可以保证 RabbitMQ 持久化 queue 的元数据,但是它是不会持久化 queue 里的数据的。
  • 第二个是发送消息的时候将消息的 deliveryMode 设置为 2 就是将消息设置为持久化的,此时 RabbitMQ 就会将消息持久化到磁盘上去。

image.png

image.png

消费者丢失

RabbitMQ 如果丢失了数据,主要是因为你消费的时候,刚消费到,还没处理,结果进程挂了,比如重启了,那么就尴尬了,RabbitMQ 认为你都消费了,这数据就丢了。

这个时候得用 RabbitMQ 提供的 ack 机制,简单来说,就是你必须关闭 RabbitMQ 的自动 ack,可以通过一个 api 来调用就行,然后每次你自己代码里确保处理完的时候,再在程序里 ack 一把。这样的话,如果你还没处理完,不就没有 ack 了?那 RabbitMQ 就认为你还没处理完,这个时候 RabbitMQ 会把这个消费分配给别的 consumer 去处理,消息是不会丢的。

image.png

image.png

消费端代码

普通队列

image.png   死信队列

image.png