RabbitMQ 核心术语 + Python pika 方法完整讲解

RabbitMQ 核心术语 + Python pika 方法完整讲解

RabbitMQ 核心术语 + Python pika 方法完整讲解

结合你之前写的生产者、消费者代码,分两大块:专业名词常用 API 方法,通俗易懂。

一、基础核心专业术语

1. 连接相关

  1. Connection 连接 客户端(PyCharm Python 程序)和 RabbitMQ 服务端之间的 TCP 长连接。 一台客户端只需要建立 1 个 Connection,开销大,不建议频繁创建销毁。 对应代码:BlockingConnection
  2. Channel 通道 复用一条 Connection 的轻量级逻辑通道,一条连接可以开成千上万个 Channel。 所有发消息、收消息、创建队列的操作都在 Channel 完成。 对应代码:connection.channel()
  3. Credentials 身份凭证 用户名 + 密码,用来登录 MQ,你用的 admin / 123456pika.PlainCredentials(user, password)
  4. Vhost 虚拟主机 MQ 内部的隔离空间,默认 /。 不同项目分配不同 vhost,队列、交换机互不干扰,类似数据库的库。

2. 消息流转核心组件

  1. Producer 生产者 发送消息的程序,你的 send.py。 逻辑:生产者 → Exchange 交换机 → Queue 队列
  2. Consumer 消费者 监听、接收、处理消息的程序,你的 receive.py
  3. Exchange 交换机 生产者不能直接发给队列,必须先发给交换机。 交换机根据规则把消息路由到绑定的队列。 四种类型:
  • direct:直连,精准匹配 routing_key(测试代码默认)
  • fanout:广播,发给所有绑定队列
  • topic:模糊匹配,日志、事件推送
  • headers:消息头匹配,几乎不用
  1. Queue 队列 存储消息的容器,消息最终存在队列里等待消费者读取。 代码 queue_declare(queue='test_queue') 声明队列。
  2. Binding 绑定 交换机 和 队列 的关联关系,规定什么样的消息路由到哪个队列。
  3. RoutingKey 路由键 生产者发消息时携带的标识,交换机根据 routing-key 匹配绑定规则。 测试代码 routing_key='test_queue'

3. 消息状态(后台页面能看到)

  1. Ready 队列中待消费、没有被消费者取走的消息。 数字持续上涨 = 消费者处理慢 / 没启动消费者。
  2. Unacked(未确认消息) 消息已经推送给消费者,但消费者还没回复 ACK 确认处理完成。 大量堆积:代码没手动 ack、程序卡死。
  3. ACK 消息确认 消费者处理完消息后,告诉 MQ:这条消息处理完毕,可以删除。
  • auto_ack=True:自动确认,消息一拿到立刻删除,丢消息风险高
  • auto_ack=False:手动确认,业务处理成功再 ack,可靠性高

4. 持久化相关

  1. Durable 持久化队列 队列持久化:MQ 重启后队列不会消失。
  2. DeliveryMode 消息持久化 消息持久化:MQ 重启后消息不丢失。

5. 其他名词

  1. Prefetch Count 预取值 一次性推送给消费者多少条消息,用来做负载均衡。
  2. Dead Letter Queue (DLQ) 死信队列 处理失败、过期、被拒绝的消息转发到死信队列,用于异常排查。
  3. Virtual Host 虚拟主机 项目资源隔离。
  4. 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
)
  1. basic_publish():发送消息核心方法
  2. exchange='':使用默认直连交换机 (AMQP default) 默认交换机特性:routing_key 等于队列名,消息直接进入对应队列
  3. routing_key:路由键,用于交换机路由消息
  4. 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
)
  1. basic_consume():订阅队列,监听消息
  2. queue:要监听的队列名称
  3. auto_ack:自动确认开关
    1. True:拿到消息立刻 ack,MQ 直接删除消息
    2. False:必须手动调用 ch.basic_ack(delivery_tag)
  4. on_message_callback:回调函数,收到消息自动执行
回调函数标准定义
python 复制代码
def callback(ch, method, properties, body):
    print(body.decode())
    # 手动确认示例(auto_ack=False时使用)
    ch.basic_ack(delivery_tag=method.delivery_tag)

参数说明:

  1. ch:当前通道对象,用来发送 ack 确认
  2. method:消息元数据,包含 delivery_tag(消息唯一标识,ack 必备)
  3. properties:消息属性(过期时间、持久化、头部信息等)
  4. body:消息字节内容
持续监听阻塞方法
python 复制代码
channel.start_consuming()

阻塞当前程序,持续等待接收消息,循环触发 callback,直到程序关闭。

5. 关闭资源

python 复制代码
connection.close()

主动断开 TCP 连接,释放通道、连接资源。

6. 其他高频方法

  1. channel.queue_delete(queue="xxx") 删除队列
  2. channel.exchange_declare() 声明自定义交换机
  3. channel.queue_bind() 绑定交换机与队列
  4. ch.basic_reject() 拒绝消息,放回队列或丢弃

三、关键流程串联(对应代码)

  1. 生产者流程 建立连接 → 创建通道 → 声明队列 → basic_publish 发消息 → 关闭连接
  2. 消费者流程 建立连接 → 创建通道 → 声明队列 → basic_consume 绑定回调 → start_consuming 阻塞监听
  3. 消息流转 生产者 → 默认交换机 → routing_key = 队列名 → 队列存储 → 消费者拉取 → ack 确认 → MQ 删除消息

四、易混概念区分

  1. Connection vs Channel Connection:TCP 连接,重;Channel:连接内逻辑通道,轻量,优先多通道少连接。
  2. auto_ack 自动确认 vs 手动 ack 自动:开发简单,服务宕机消息丢失;手动:业务安全,推荐生产环境使用。
  3. Ready vs Unacked Ready:没人拿;Unacked:拿走但没处理完确认。
  4. 15672 和 5672 5672:程序代码通信端口;15672:Web 管理后台端口。
相关推荐
爱读书的小胖1 小时前
无偿分享ChatGPT Image 2画图网页与并发绘图python程序【Ai绘图】
开发语言·python·chatgpt
cvcode_study1 小时前
Scikit-learn
python·机器学习·scikit-learn
vortex51 小时前
新手前后端开发学习指南:从Flask框架到全栈实践
后端·python·flask
你是个什么橙2 小时前
Python入门学习1:安装配置开发环境——Python或Annaconda,Pycharm
python·学习·pycharm
xxwl5852 小时前
Python语言初步认识(1)
开发语言·python·学习
风吹夏回2 小时前
RabbitMQ 三种模式入门:HelloWorld、WorkQueue、PubSub
分布式·rabbitmq·ruby
古城小栈2 小时前
Python 的主流Ai框架为什么优先适配 Linux 系统?
linux·人工智能·python
财经资讯数据_灵砚智能2 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年6月15日
大数据·人工智能·python·ai·信息可视化·自然语言处理·灵砚智能