生产+消费结构
- 生产者连上Broker,开Channel。
- 生产者发消息(带Routing Key)给Exchange。
- Exchange按规则把消息路由到Queue。
- Queue把消息推给订阅的Consumer(前提是Consumer有处理能力,未达prefetch上限)。
- Consumer拿到消息,开始处理(比如解析JSON、写数据库、调用其他服务)。
- 处理成功后,Consumer发送ACK。
- Broker收到ACK,从队列中删除该消息。
- 如果处理失败:Consumer可以发送NACK(否定确认)或让消息超时,消息会重新入队或进入死信队列。

生产端
- 生产端代码:
python
#生产者MQ端,
#第一步:导包
import pika
#第二步:连接和声明管道
connection=pika.BlockingConnection(
pika.ConnectionParameters('localhost')
)
channel=connection.channel() #声明管道,在管道中发送消息
#第三步:声明queue队列
channel.queue_declare(queue='hello', durable=True)
#第四步:通过管道发布消息,routing_key队列名称
channel.basic_publish(exchange='',
routing_key='hello',
body='hello world中国'
# properties=pika.BasicProperties(delivery_mode=2) # 可选:让消息也持久化)
)
print("[x] sent 'hello world")
#第六步:连接关闭
connection.close()
测试结果:

消费端
- 消费端代码:
python
#消费者端MQ
#第一步:导包
import time
import pika
#定义回调函数处理消息
def callback(ch,method,properties,body):
# print("->",ch,method,properties)
# print(" [x] received %r "%body)
time.sleep(3)
print("[x] Received {}".format(body.decode()))
#第二步:连接,声明管道,需要在管道中发送消息
connection=pika.BlockingConnection(
pika.ConnectionParameters('localhost')
)
channel=connection.channel()
#第三步: 声明队列(必须与生产者一致,例如 durable=True) durable 参数默认是 False(非持久化)
channel.queue_declare(queue='hello', durable=True)
#第四步:核心步骤订阅队列,注册回调函数
#这个方法是RabbitMQ 消费者端的核心,用于告诉 RabbitMQ:"我要开始从这个队列接收消息了,每收到一条,就调用我指定的函数来处理"
channel.basic_consume(
on_message_callback=callback, #如果收到消息就调用callback函数处理消息
queue='hello', ## 要消费的队列名
# True自动确认(消息一旦被发送给消费者,RabbitMQ 就立即将其标记为"已删除"),如果消费者处理过程中崩溃,这条消息就永久丢失了,不安全
# False手动确认(消费者收到消息后,需要在自己的回调函数里,显式地调用 channel.basic_ack() 来告诉 RabbitMQ 这条消息已经处理完毕),安全保证消息不丢失
auto_ack=False,
exclusive=False,
consumer_tag=None,
arguments=None
)
print("[*] waiting for message. exit press CTRL+C")
#第五步:启动消费循环,开始监听
channel.start_consuming()
#第六步:连接关闭
connection.close()
测试结果:

执行命令rabbitmqctl.bat list_queues--查看队列及其消息数量
- sbin目录下输入cmd,进入命令行窗口,输入
rabbitmqctl.bat list_queues结果报错;

- 原因:rabbitmqctl 命令与 RabbitMQ 服务节点之间的通信出了状况,导致命令无法执行;
- Windows 系统中服务端和用户端的cookies不一致导致;
- 服务端 Cookie(RabbitMQ 服务以 Local System 账户运行时使用):
- C:\Windows\System32\config\systemprofile.erlang.cookie
- 用户端 Cookie(你当前命令行用户使用):
- C:\Users<你的用户名>.erlang.cookie
- 服务端 Cookie(RabbitMQ 服务以 Local System 账户运行时使用):
- 修改客户端的cookies,改为和服务端一样
- 重启rabbit服务:net stop RabbitMQ && net start RabbitMQ

- 再次在sbin目录输入》》 rabbitctl.bat list_queues
