前言
使用python3来处理redis 消息队列,记录下生产部署方案
「生产部署方案」:
- 多进程(动态扩容)
- 无限自愈
- 日志自动压缩
- 系统级守护
- 可多队列多worker
终极稳健版:PM2 + Logrotate + 自动扩容 + 守护链
适合:
- Python 消费消息队列(如 RabbitMQ / Redis / Kafka)
- 长期运行、吞吐量大、CPU吃满
- 需要自动扩容/无限重启/日志不爆盘
1)增强版 ecosystem.config.js
module.exports = {apps: [{name: "queue-worker",script: "worker.py",interpreter: "python3",instances: "max", // 自动用满 CPU 核心 (动态扩容)exec_mode: "fork",autorestart: true,max_restarts: 0, // 无限重启restart_delay: 5000, // 每次重启间隔 5 秒(防止频繁挂死)out_file: "./logs/out.log",error_file: "./logs/err.log",merge_logs: true,log_date_format: "YYYY-MM-DD HH:mm:ss",// 环境变量 (可选)env: {ENV: "production"}}]
}
新加的稳健细节
instances: "max"
👉 自动用满服务器CPU,吞吐最大化(多核并发)restart_delay: 5000
👉 挂了重启时,隔5秒(防止疯狂重启,保护系统)max_restarts: 0
👉 无限重启,保证永远活着
2)高级日志管理:pm2-logrotate
配置
继续用 PM2 官方日志切割模块:
安装一次:
pm2 install pm2-logrotate
稳定生产配置:
# 单个日志文件最大 100MB
pm2 set pm2-logrotate:max_size 100M# 每天0点自动切割
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'# 日志自动 gzip 压缩
pm2 set pm2-logrotate:compress true# 保留最近 30 份,其他自动删
pm2 set pm2-logrotate:retain 30# 每个日志加时间戳
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss
3)PM2 启动 + 守护链
启动 worker
pm2 start ecosystem.config.js
保存 & 开机自动守护
pm2 save # 保存当前进程列表
pm2 startup # 设置开机自启 (输出一条命令,复制执行即可)
重启服务器后,PM2 会自动帮你拉起 worker
无需手动启动。
4)动态扩容 / 缩容 Worker
操作 | 命令 |
---|---|
扩容到 8 个进程 | pm2 scale queue-worker 8 |
缩容到 2 个进程 | pm2 scale queue-worker 2 |
恢复 CPU自动模式 (最大核) | pm2 scale queue-worker max |
👉 动态扩容:你根据队列压力,随时弹性扩容/缩容 worker 数量,不需要重启整个服务。
5)健康监控 & 自动修复
实时查看 worker 状态
pm2 list
查看具体日志
pm2 logs queue-worker
如果 worker 进程挂掉?
- PM2 会自动重启(
max_restarts: 0
+restart_delay
)
6)推荐加分:搭配系统级 Supervisor 守护 PM2
为了做到**“连 PM2 自己挂了也能自动拉起”**:
- 可以让 systemd / Supervisor 来守护 PM2
- 这样你的守护链是:
systemd ➡️ pm2 ➡️ queue-worker
三层保护,稳得很!
7)进阶:如果要多队列消费
假如你未来还想同时跑多个队列 worker:
module.exports = {apps: [{name: "queue-A-worker",script: "worker_a.py",interpreter: "python3",instances: "max",exec_mode: "fork",autorestart: true,max_restarts: 0,restart_delay: 5000,out_file: "./logs/queue_a_out.log",error_file: "./logs/queue_a_err.log",merge_logs: true,},{name: "queue-B-worker",script: "worker_b.py",interpreter: "python3",instances: 4,exec_mode: "fork",autorestart: true,max_restarts: 0,restart_delay: 5000,out_file: "./logs/queue_b_out.log",error_file: "./logs/queue_b_err.log",merge_logs: true,}]
}
这样一个 PM2就能管理多个队列 worker。
稳健生产版总结口诀
- 🟢
instances: "max"
➔ 吃满CPU,性能最大化 - 🟢
max_restarts: 0
➔ 无限重启,永远活着 - 🟢
restart_delay: 5000
➔ 挂了5秒后再拉起(防止崩溃风暴) - 🟢
pm2-logrotate
➔ 自动切割+压缩日志,硬盘安全 - 🟢
pm2 save + startup
➔ 开机自动拉起