1 概念

其实我以前写服务程序,对于队列,好像一直就是写一个数组或者链表就行了。将Socket放来的数据扔进去。有时候甚至直接用select的缓冲区。
最近才看到,原来现在MQ也独立出来成为中间件了。。。在现在后端开发中,说的消息队列并不是我们理解的消息队列数据结构,而是消息队列中间件。
使用这个中间件好处就是以下这些:
- 高可用:集群、镜像队列、主从复制
- 消息可靠:持久化、Publisher Confirm、Consumer Ack、死信队列
- 灵活路由:四种 Exchange 类型,满足单播 / 广播 / 复杂匹配
- 多语言客户端:Java、Go、Python、.NET、PHP 等
- 管理界面:15672 端口,可视化监控、配置
- 延迟队列 / 死信队列:处理超时、重试、失败消息
总的来说,RabbitMQ就是一个高速、可靠的消息 "中转站/快递分拣中心"。用现在正在做的物联网系统为例,系统收到数据后,先送到RabbitMQ,然后由RabbitMQ决定分发到哪里。这样的好处就是保证了接受消息的绝对稳定,即使系统宕机,消息也能保存并处理。如果遇到瞬间多个消息,有自己的平衡机制,保证接收不丢包。最后是数据可以发送到多个后端进行处理,直接在网页中配置即可。
2 安装
安装RabbitMQ
导入 RabbitMQ 官方签名密钥(信任官方包)
curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" \ | sudo gpg --dearmor \ | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg > /dev/null
添加 RabbitMQ 官方 APT 源(自动带正确 Erlang)(Ubuntu 22.04)
sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF deb arch=amd64 signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg https://deb1.rabbitmq.com/rabbitmq-erlang/ubuntu/jammy jammy main deb arch=amd64 signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg https://deb1.rabbitmq.com/rabbitmq-server/ubuntu/jammy jammy main EOF
sudo apt update
sudo apt install -y rabbitmq-server
检查sudo systemctl status rabbitmq-server
sudo rabbitmq-plugins enable rabbitmq_management(开启 Web 管理界面)
默认地址:http:// 本机 IP:15672
默认账号 / 密码:guest / guest(只能本机访问)
启动 RabbitMQ 服务,访问本地15672就能打开服务网页。

3 实验
安装依赖
pip3 install pika --break-system-packages
python
import pika
import json
# 连接 RabbitMQ
credentials = pika.PlainCredentials('guest', 'guest') # 默认账号密码
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='127.0.0.1', credentials=credentials)
)
channel = connection.channel()
# 声明持久化队列
queue_name = "sensor_data_queue"
channel.queue_declare(queue=queue_name, durable=True)
# 模拟传感器数据
sensor_data = {
"device_id": "sensor_001",
"temperature": 25.6,
"humidity": 62.3,
"timestamp": 1748512000
}
# 发送持久化消息
channel.basic_publish(
exchange='',
routing_key=queue_name,
body=json.dumps(sensor_data),
properties=pika.BasicProperties(
delivery_mode=2 # 消息持久化
)
)
print("传感器数据已发送:", sensor_data)
connection.close()
python
import pika
import json
credentials = pika.PlainCredentials('guest', 'guest')
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='127.0.0.1', credentials=credentials)
)
channel = connection.channel()
queue_name = "sensor_data_queue"
channel.queue_declare(queue=queue_name, durable=True)
# 预取值,批量消费提升吞吐
channel.basic_qos(prefetch_count=50)
def callback(ch, method, properties, body):
# 解析数据
data = json.loads(body)
print("收到传感器数据:", data)
# ===== 这里写业务逻辑:数据校验、入库、告警等 =====
# 处理完成,手动ACK
ch.basic_ack(delivery_tag=method.delivery_tag)
# 开始监听消费
channel.basic_consume(
queue=queue_name,
on_message_callback=callback
)
print("消费者已启动,等待数据...")
channel.start_consuming()
运行结果:
