不想安装Erlang,所以使用docker来安装,链接: 选择带management的(有网页UI)
Docker Hub
运行命令进行下载: docker pull rabbitmq:3.9.10-management-alpine
运行 docker run -dit --name Myrabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:3.9.10-management-alpine
查看日志: docker logs Myrabbitmq
登录web进行访问:http://ip:15672 用户名 密码是上面设的admin admin
工作模式
RabbitMQ Tutorials — RabbitMQ
重要的组间:Exchang/ routing/ Queue,(routing 是Exchang与Queue相连的部分),通过Exchang/ routing/ Queue不同的绑定,形成了不同的工作模式(不标定Exchang/ routing/ Queue,后走默认的路径)
# 查看所有队列
rabbitmqctl list_queues
# 根据 queue_name 参数,删除对应的队列
rabbitmqctl delete_queue queue_name
rabbitmqctl start_app/reset/stop_app
python需要安装pika
若Queue的名字已经生成,修改的Queue的属性,直接运行会报错,先删除对应的Queue(http://192.168.4.37:15672/#/queues 选择对应的Queue,在下面有删除功能)
MQ默认建立的是临时 queue 和 exchange,如果不声明持久化,一旦 rabbitmq 挂掉,queue、exchange 将会全部丢失。所以我们一般在创建 queue 或者 exchange 的时候会声明 持久化。
1.queue 声明持久化
# 声明消息队列,消息将在这个队列传递,如不存在,则创建。durable = True 代表消息队列持久化存储,False 非持久化存储 result = channel.queue_declare(queue = 'python-test',durable = True)
2.exchange 声明持久化
# 声明exchange,由exchange指定消息在哪个队列传递,如不存在,则创建.durable = True 代表exchange持久化存储,False 非持久化存储 channel.exchange_declare(exchange = 'python-test', durable = True)
3.消息持久化
虽然 exchange 和 queue 都申明了持久化,但如果消息只存在内存里,rabbitmq 重启后,内存里的东西还是会丢失。所以必须声明消息也是持久化,从内存转存到硬盘。
# 向队列插入数值 routing_key是队列名。delivery_mode = 2 声明消息在队列中持久化,delivery_mod = 1 消息非持久化 channel.basic_publish(exchange = '',routing_key = 'python-test',body = message, properties=pika.BasicProperties(delivery_mode = 2))
4.acknowledgement 消息不丢失
消费者(consumer)调用callback函数时,会存在处理消息失败的风险,如果处理失败,则消息丢失。但是也可以选择消费者处理失败时,将消息回退给 rabbitmq ,重新再被消费者消费,这个时候需要设置确认标识。
channel.basic_consume(callback,queue = 'python-test', # no_ack 设置成 False,在调用callback函数时,未收到确认标识,消息会重回队列。True,无论调用callback成功与否,消息都被消费掉 no_ack = False)
python 操作RabbitMq详解 - 三只松鼠 - 博客园