多队列

为什么需要多队列?

单一 ZSet 队列的问题:

问题:任务量过大

假设每天 1000 万任务:
- 30 分钟内:450 万
- 30 分钟~7 天:350 万
- 7 天以上:200 万

所有任务都在同一个 ZSet:
- 内存占用:1000 万 × 1KB = 10GB
- 查询效率:扫描整个 ZSet 找到期任务
- 清理困难:已完成的任务需要单独清理

多队列架构

按延时范围分层

┌─────────────────────────────────────────────────────────┐
│                    多队列延时架构                        │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  热数据层(短延时队列)                                   │
│  • 延时范围:< 30 分钟                                   │
│  • 精度:秒级                                           │
│  • 内存:少量(任务快速完成)                              │
│  • Redis: zset:short                                   │
│                                                         │
│  温数据层(中延时队列)                                   │
│  • 延时范围:30 分钟 ~ 7 天                              │
│  • 精度:分钟级                                         │
│  • 内存:中等                                           │
│  • Redis: zset:medium                                  │
│                                                         │
│  冷数据层(长延时队列)                                   │
│  • 延时范围:> 7 天                                     │
│  • 精度:小时级                                         │
│  • 内存:少(使用数据库轮询)                              │
│  • Database: delay_tasks_long                           │
│                                                         │
└─────────────────────────────────────────────────────────┘

方案落地


多队列的优势

优势说明
内存优化长延时任务不占用 Redis 内存
性能优化短延时任务查询更快
精度优化不同层级使用不同精度
成本优化减少内存使用,降低成本
可扩展可以独立扩展不同层级