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

运行结果:

相关推荐
里欧跑得慢3 小时前
Flutter主题与样式详解
前端·css·flutter·web
嘿嘿-661 天前
Windows 一键使用 GPT-6 Astra:Codex CLI 配置教程
java·人工智能·windows·gpt·chatgpt·web
嘿嘿-661 天前
gpt-6-astra测试,测试你的模型有没有降智
人工智能·gpt·chatgpt·web
cui_ruicheng1 天前
FastAPI 应用开发(二):请求响应、Pydantic 模型与依赖注入
python·fastapi·web
智者知已应修善业3 天前
C#用一个循环[等效]取出字符串中的数字
网络·c#·web·string·语言
岁岁的O泡奶6 天前
[NSSCTF 2022 Spring Recruit]babyphp
经验分享·web·ctf
里欧跑得慢9 天前
AI 驱动的 UI 国际化方案自动适配:从单一语言到多语言布局的智能转换
前端·css·flutter·web
里欧跑得慢10 天前
Flutter 像素级还原:设计稿到代码的视觉无损转换技巧
前端·css·flutter·web
深念Y12 天前
# CC-Switch + Claude/Codex 折腾教训记录
运维·服务器·网络·ai·agent·web·ccsiwtch
钛态12 天前
Vite 中的 CSS 工程化:从 CSS Modules 到 UnoCSS 的渐进式迁移
前端·vue·react·web