RabbitMQ消息队列

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

发送send.py

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()

接收并处理rec.py

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()

运行结果:

相关推荐
Web打印11 小时前
HttpPrinter(web打印控件)的gridreport和Fastreport对 ☑、★、✓ 等 Unicode 符号的支持
chrome·pdf·web
alwaysrun13 小时前
python之异步高性能Web框架 FastAPI
python·fastapi·web·路由·pydantic
Web打印14 小时前
2027年Web打印的几种方法
前端·pdf·web
曲幽1 天前
写页面时别再把 Element Plus 整个搬进来啦!Vue3按需加载的坑我帮你踩平了
vue3·web·vite·icon·element plus·vs code·import·unplugin
大数据魔法师1 天前
Streamlit(十一)- API 参考文档(四)- 图表元素
python·web
24kmaigc1 天前
NewStarCTF2025-ssti在哪里?-ssrf与ssti注入
python·网络安全·flask·web
大神15732 天前
重磅免费开放!基于B/S模式的Peach-Editor电子病历编辑器正式上线
javascript·编辑器·web
星栈独行3 天前
我在 Rust 全栈项目里用 JWT 做无状态认证
开发语言·后端·rust·前端框架·开源·github·web
曲幽3 天前
FastApiAdmin 后端接口开发好了,前端管理界面怎么调用与显示?
python·vue3·api·fastapi·web·ant design·view·menu·frontend