前言
使用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
? 開機自動拉起