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

运行结果:

相关推荐
湮w11 小时前
JavaWeb(三)JavaScript详细讲解
java·javascript·web
还是鼠鼠1 天前
AI掘金头条新闻系统 (Toutiao News)-缓存相关推荐新闻
后端·python·mysql·fastapi·web
曲幽1 天前
从卡顿到丝滑:FastAPI 调用外部 API 的正确姿势(httpx 实战)
python·fastapi·web·async·httpx·client·await·requests·aiohttp
还是鼠鼠4 天前
AI掘金头条新闻系统 (Toutiao News)-缓存新闻详情
后端·python·mysql·fastapi·web
曲幽10 天前
你的REST接口还在“过度投喂”数据吗?——FastAPI + GraphQL实战避坑指南
python·fastapi·web·graphql·route·cors·rest·strawberry
带刺的坐椅12 天前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·springboot·web·solon
曲幽16 天前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
曲幽17 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
llz_11223 天前
web-第四次课后作业
前端·spring boot·web
天山@12324 天前
电商系统Web渗透测试实战学习笔记
web·电商系统