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

运行结果:

相关推荐
REDcker2 天前
Cesium三维WebGIS入门详解
前端·gis·web·cesium·webgis
罗超驿3 天前
JavaEE进阶之路:从Web架构原理到HTML标签全解析
前端·html·web·javaee
DogDaoDao3 天前
OpenBrowser 深度解析:让 AI 真正「用上」浏览器的自主代理框架
人工智能·程序员·大模型·github·web·ai工具·openbrowser
jieyucx7 天前
Nuxt4阶段六:工程化与进阶 —— 模块、中间件、插件、TS 与测试
中间件·vue·web·nuxt·全栈·ssr
jieyucx8 天前
Nuxt阶段二:核心概念 —— 路由、布局、组件与 Composables
vue·web·nuxt·全栈·seo·ssr
kali-Myon10 天前
深入 MySQL 内核:从临时哈希表分配机制详解 Floor 报错注入核心原理
数据库·sql·mysql·安全·web
钛态11 天前
前端安全防线:CSRF 攻击链路与双重 Token 校验的工程实现
前端·vue·react·web
钛态12 天前
AI 组件生成评测:别只看页面能不能渲染
前端·vue·react·web
shuoshuohaohao15 天前
《HTTP协议》
java·web
湮w21 天前
JavaWeb(三)JavaScript详细讲解
java·javascript·web