加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

rabbitmq mysql持久化_RabbitMQ消息持久化

发布时间:2022-12-05 17:33:37 所属栏目:MySql教程 来源:网络
导读: 一、前言
如果我们希望即使在RabbitMQ服务重启的情况下,也不会丢失消息,我们可以将Queue与Message都设置为可持久化的(durable),这样可以保证绝大部分情况下我们的RabbitMQ消息不会丢失。

一、前言

如果我们希望即使在RabbitMQ服务重启的情况下,也不会丢失消息,我们可以将Queue与Message都设置为可持久化的(durable),这样可以保证绝大部分情况下我们的RabbitMQ消息不会丢失。当然还是会有一些小概率事件会导致消息丢失。

二、队列持久化

2.1 查看存在的队列和消息数量

在windows环境下,在rabbitmq的安装目录/sbin下,通过rabbitmqctl.bat list_queues查看

ac48b24fbccd7568c99a3a381cdc402f.png

这边启动了两个producer,分别生成两个队列hello 和 hello1,并且他们都有一个消息存在

重启rabbitmq,模拟故障

a6b41c46149028d0a749d9fadd08ebc3.png

可以看到重启后两个队列都消失了

2.2 持久化队列

我们就hello队列持久化

在声明队列名称时,持久化队列,生产端和消费端都要

channel.queue_declare(queue='hello', durable=True)

我们重复上面的操作,但是给hello队列做持久化,而hello1不做,并重启rabbitmq

caa9f6707d2158b0dcae0c67469334a0.png

可以看到重启后,hello队列还在,hello1队列消失了,但是原本hello中的一条消息也没有保存下来。所以在这边我们仅仅做到了消息队列的持久化,还没有做消息持久化。

三、消息持久化

我们刚才实现了在rabbitmq崩溃的情况下,就队列本身保存下来,重启后队列还在。接下来我们要将消息也保存下来,即消息的持久化

channel.basic_publish(exchange='',

routing_key='hello',

body='hello',

properties=pika.BasicProperties(

delivery_mode=2, # make message persistent

杜蕾斯持久装和杰士邦持久装_杜蕾斯持久装持久多久_mysql持久化

))

# 增加properties,这个properties 就是消费端 callback函数中的properties

# delivery_mode = 2 持久化消息

生产端生成一个消息mysql持久化,并重启rabbitmq

880b42b0a90c098110fc4347188ce168.png

可以看到,经过队列和消息持久化后的hello, 在重启的情况下,队列和消息都存在,没有消失。

消费端再重启后也能正常接收

604b606dab984b6e48c0d15fcae7fe35.png

四、总结

队列持久化需要在声明队列时添加参数durable=True,这样在rabbitmq崩溃时也能保存队列

仅仅使用durable=True ,只能持久化队列,不能持久化消息

消息持久化需要在消息生成时,添加参数properties=pika.BasicProperties(delivery_mode=2)

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!