RabbitMQ 核心术语 + Python pika 方法完整讲解
RabbitMQ 核心术语 + Python pika 方法完整讲解
结合你之前写的生产者、消费者代码,分两大块:专业名词 、常用 API 方法,通俗易懂。
一、基础核心专业术语
1. 连接相关
- Connection 连接 客户端(PyCharm Python 程序)和 RabbitMQ 服务端之间的 TCP 长连接。 一台客户端只需要建立 1 个 Connection,开销大,不建议频繁创建销毁。 对应代码:
BlockingConnection - Channel 通道 复用一条 Connection 的轻量级逻辑通道,一条连接可以开成千上万个 Channel。 所有发消息、收消息、创建队列的操作都在 Channel 完成。 对应代码:
connection.channel() - Credentials 身份凭证 用户名 + 密码,用来登录 MQ,你用的
admin / 123456。pika.PlainCredentials(user, password) - Vhost 虚拟主机 MQ 内部的隔离空间,默认
/。 不同项目分配不同 vhost,队列、交换机互不干扰,类似数据库的库。
2. 消息流转核心组件
- Producer 生产者 发送消息的程序,你的
send.py。 逻辑:生产者 → Exchange 交换机 → Queue 队列 - Consumer 消费者 监听、接收、处理消息的程序,你的
receive.py。 - Exchange 交换机 生产者不能直接发给队列,必须先发给交换机。 交换机根据规则把消息路由到绑定的队列。 四种类型:
direct:直连,精准匹配 routing_key(测试代码默认)fanout:广播,发给所有绑定队列topic:模糊匹配,日志、事件推送headers:消息头匹配,几乎不用
- Queue 队列 存储消息的容器,消息最终存在队列里等待消费者读取。 代码
queue_declare(queue='test_queue')声明队列。 - Binding 绑定 交换机 和 队列 的关联关系,规定什么样的消息路由到哪个队列。
- RoutingKey 路由键 生产者发消息时携带的标识,交换机根据 routing-key 匹配绑定规则。 测试代码
routing_key='test_queue'
3. 消息状态(后台页面能看到)
- Ready 队列中待消费、没有被消费者取走的消息。 数字持续上涨 = 消费者处理慢 / 没启动消费者。
- Unacked(未确认消息) 消息已经推送给消费者,但消费者还没回复 ACK 确认处理完成。 大量堆积:代码没手动 ack、程序卡死。
- ACK 消息确认 消费者处理完消息后,告诉 MQ:这条消息处理完毕,可以删除。
auto_ack=True:自动确认,消息一拿到立刻删除,丢消息风险高auto_ack=False:手动确认,业务处理成功再 ack,可靠性高
4. 持久化相关
- Durable 持久化队列 队列持久化:MQ 重启后队列不会消失。
- DeliveryMode 消息持久化 消息持久化:MQ 重启后消息不丢失。
5. 其他名词
- Prefetch Count 预取值 一次性推送给消费者多少条消息,用来做负载均衡。
- Dead Letter Queue (DLQ) 死信队列 处理失败、过期、被拒绝的消息转发到死信队列,用于异常排查。
- Virtual Host 虚拟主机 项目资源隔离。
- Node 节点 RabbitMQ 服务实例,你 Docker 启动的单个节点。
二、Python pika 常用方法逐行讲解
1. 连接创建
python
credentials = pika.PlainCredentials('admin', '123456')
PlainCredentials(username, password)创建登录凭证,明文账号密码认证。
python
connection = pika.BlockingConnection(
pika.ConnectionParameters(
host='服务器IP',
port=5672,
credentials=credentials
)
)
ConnectionParameters:连接参数,指定 MQ 地址、端口、账号BlockingConnection:阻塞式同步连接,新手最简单,所有操作同步等待返回
python
channel = connection.channel()
基于 TCP 连接创建通道,所有操作的载体。
2. 队列声明
python
channel.queue_declare(queue='test_queue')
作用:
声明队列,如果队列不存在则自动创建;已存在则无任何操作,生产者和消费者都必须声明同一个队列。
常用可选参数:
durable=True:队列持久化,重启不消失exclusive=True:独占队列,连接断开自动删除auto_delete=True:无消费者时自动删除队列
3. 发送消息方法(生产者核心)
python
channel.basic_publish(
exchange='',
routing_key='test_queue',
body=msg
)
basic_publish():发送消息核心方法exchange='':使用默认直连交换机 (AMQP default) 默认交换机特性:routing_key 等于队列名,消息直接进入对应队列routing_key:路由键,用于交换机路由消息body:消息内容,只能传字节串,字符串需要 encode ()
扩展参数(持久化消息):
python
properties=pika.BasicProperties(delivery_mode=2)
delivery_mode=2 代表消息持久化,重启 MQ 消息不丢失。
4. 消费监听相关(消费者核心)
python
channel.basic_consume(
queue='test_queue',
auto_ack=True,
on_message_callback=callback
)
basic_consume():订阅队列,监听消息queue:要监听的队列名称auto_ack:自动确认开关- True:拿到消息立刻 ack,MQ 直接删除消息
- False:必须手动调用
ch.basic_ack(delivery_tag)
on_message_callback:回调函数,收到消息自动执行
回调函数标准定义
python
def callback(ch, method, properties, body):
print(body.decode())
# 手动确认示例(auto_ack=False时使用)
ch.basic_ack(delivery_tag=method.delivery_tag)
参数说明:
ch:当前通道对象,用来发送 ack 确认method:消息元数据,包含 delivery_tag(消息唯一标识,ack 必备)properties:消息属性(过期时间、持久化、头部信息等)body:消息字节内容
持续监听阻塞方法
python
channel.start_consuming()
阻塞当前程序,持续等待接收消息,循环触发 callback,直到程序关闭。
5. 关闭资源
python
connection.close()
主动断开 TCP 连接,释放通道、连接资源。
6. 其他高频方法
channel.queue_delete(queue="xxx")删除队列channel.exchange_declare()声明自定义交换机channel.queue_bind()绑定交换机与队列ch.basic_reject()拒绝消息,放回队列或丢弃
三、关键流程串联(对应代码)
- 生产者流程 建立连接 → 创建通道 → 声明队列 → basic_publish 发消息 → 关闭连接
- 消费者流程 建立连接 → 创建通道 → 声明队列 → basic_consume 绑定回调 → start_consuming 阻塞监听
- 消息流转 生产者 → 默认交换机 → routing_key = 队列名 → 队列存储 → 消费者拉取 → ack 确认 → MQ 删除消息
四、易混概念区分
- Connection vs Channel Connection:TCP 连接,重;Channel:连接内逻辑通道,轻量,优先多通道少连接。
- auto_ack 自动确认 vs 手动 ack 自动:开发简单,服务宕机消息丢失;手动:业务安全,推荐生产环境使用。
- Ready vs Unacked Ready:没人拿;Unacked:拿走但没处理完确认。
- 15672 和 5672 5672:程序代码通信端口;15672:Web 管理后台端口。