RabbitMq如何防止消息丢失?
生产者丢失
①开启事务机制,但是性能不是很高
网络异常,图片无法展示
|
②开启异步confirm机制,性能最高
网络异常,图片无法展示
|
网络异常,图片无法展示
|
RabbitMq丢失
设置RabbitMq持久化,有两个步骤:
- 创建 queue 的时候将其设置为持久化 这样就可以保证 RabbitMQ 持久化 queue 的元数据,但是它是不会持久化 queue 里的数据的。
- 第二个是发送消息的时候将消息的
deliveryMode
设置为 2 就是将消息设置为持久化的,此时 RabbitMQ 就会将消息持久化到磁盘上去。
网络异常,图片无法展示
|
网络异常,图片无法展示
|
消费者丢失
RabbitMQ 如果丢失了数据,主要是因为你消费的时候,刚消费到,还没处理,结果进程挂了,比如重启了,那么就尴尬了,RabbitMQ 认为你都消费了,这数据就丢了。
这个时候得用 RabbitMQ 提供的 ack
机制,简单来说,就是你必须关闭 RabbitMQ 的自动 ack
,可以通过一个 api 来调用就行,然后每次你自己代码里确保处理完的时候,再在程序里 ack
一把。这样的话,如果你还没处理完,不就没有 ack
了?那 RabbitMQ 就认为你还没处理完,这个时候 RabbitMQ 会把这个消费分配给别的 consumer 去处理,消息是不会丢的。
网络异常,图片无法展示
|
网络异常,图片无法展示
|
消费端代码
普通队列
网络异常,图片无法展示
|
死信队列
网络异常,图片无法展示
|