RabbitMQ消息队列AI中转异步

使用RabbitMQ消息队列实现AI异步中转:从零搭建到上线

很多AI服务在请求量上来之后,都会用消息队列做异步解耦——前端把任务丢进队列,后端Worker慢慢消费。
RabbitMQ是其中非常成熟的选择。
本文会从零开始,让你在同一台服务器上搭好RabbitMQ,建一个专门用来中转AI任务的主题交换机,再跑通一条最简单的生产-消费链路。

环境准备与安装

你需要一台Linux服务器(CentOS 7+或Ubuntu 20+),内存建议不低于1GB。
如果没有现成环境,可以在本地用虚拟机或云厂商试用机。
RabbitMQ基于Erlang,所以得先装Erlang。

# CentOS 7
sudo yum install epel-release
sudo yum install erlang
# Ubuntu 20.04
sudo apt update
sudo apt install erlang

装完之后检查Erlang版本:

erl -version

显示类似Erlang (erts-12.2)说明成功。
然后安装RabbitMQ服务,推荐从官方仓库获取最新稳定版本:

# CentOS 7
sudo rpm --import https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey
curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bash
sudo yum install rabbitmq-server
# Ubuntu 20.04
curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.deb.sh | sudo bash
sudo apt install rabbitmq-server

安装完成后启动服务并设为开机自启:

sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server
sudo systemctl status rabbitmq-server

看到active (running)字样就表示启动成功。

创建中转队列与交换机

登录管理后台方便直观操作:

sudo rabbitmq-plugins enable rabbitmq_management

重启后浏览器打开 http://<你的IP>:15672,默认用户名密码都是guest
登录后点击 Exchanges -> Add a new exchange
名称填ai_transfer_exchange,类型选topic,Durable勾上,点确定。
然后点击 Queues -> Add a new queue,名称ai_task_queue,Durable勾上。
回到Exchange列表,点进ai_transfer_exchange,在Bindings处填入ai_task_queue和路由键task.#,点Bind。
这样所有发往task.*的消息都会被送进ai_task_queue

你也可以用命令行完成相同操作:

sudo rabbitmqadmin declare exchange name=ai_transfer_exchange type=topic durable=true
sudo rabbitmqadmin declare queue name=ai_task_queue durable=true
sudo rabbitmqadmin declare binding source=ai_transfer_exchange destination_type=queue destination=ai_task_queue routing_key="task.#"

生产者与消费者代码示例

这里用Python演示,装好pika

pip install pika

生产者(模拟AI任务提交):

import pika, json

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

message = {"user_id": 1001, "prompt": "生成一张日落图片"}
channel.basic_publish(
    exchange='ai_transfer_exchange',
    routing_key='task.image.generation',
    body=json.dumps(message),
    properties=pika.BasicProperties(delivery_mode=2)  # 消息持久化
)
print("消息已发送")
connection.close()

消费者(Worker端,持续监听队列处理):

import pika, json

def callback(ch, method, properties, body):
    data = json.loads(body)
    print(f"收到AI任务: {data}")
    # 模拟处理耗时
    import time
    time.sleep(1)
    print(f"任务 {data['user_id']} 处理完毕")
    ch.basic_ack(delivery_tag=method.delivery_tag)

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='ai_task_queue', durable=True)
channel.basic_qos(prefetch_count=1)
channel.basic_consume(queue='ai_task_queue', on_message_callback=callback)
print('等待AI任务...')
channel.start_consuming()

先在一个终端启动消费者,再在另一个终端运行生产者,你会看到消费者收到消息并打印结果。

常见问题与避坑指南

  • 连接不上管理后台:检查防火墙是否放行了15672端口,以及RabbitMQ服务是否运行。
  • 消息丢失:务必声明队列和交换机时加上durable=True,并且生产者设置delivery_mode=2,确保RabbitMQ重启后消息不丢失。
  • 消费报错“PRECONDITION_FAILED”:通常是队列或交换机参数不匹配,重新声明时加durable=True并确保名称一致。
  • 性能调优:对于AI中转场景,建议将prefetch_count设为1或2,避免一个Worker积压太多任务导致OOM。

验证效果的方法

跑通上面生产-消费示例后,你可以在管理后台的Queues页查看ai_task_queue的Ready、Unacked和Total数量。
当生产者发送消息后,Ready+1;
消费者消费后,Ready减1,Unacked加1,确认后Unacked归零。
如果队列长时间没有消息堆积,说明中转链路正常工作。
你也可以写一个简单的脚本定时发送随机任务,看消费者是否稳定处理。

如果你正在处理RabbitMQ消息队列AI中转异步的需求,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。

分享到:
上一篇
MongoDB存储跨境产品数据库:从设计到运维的完整指南
下一篇
Traefik反向代理容器多站点:从零搭建到自动HTTPS
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意