关键决策
关键决策点
决策 1:存储方案选择
问题: 使用 Redis 还是数据库?
决策树:
任务量 < 10 万/天?
├─ 是 → 数据库轮询(简单)
└─ 否 →
├─ 精度要求秒级?
│ ├─ 是 → Redis ZSet
│ └─ 否 → 数据库轮询
└─ 成本敏感?
├─ 是 → 分层方案
└─ 否 → Redis ZSet推荐:
- 小规模:数据库轮询
- 中等规模:Redis ZSet
- 大规模:分层方案
决策 2:精度要求
问题: 需要多高的精度?
精度分级:
┌─────────────────────────────────────────┐
│ 精度要求分级 │
├─────────────────────────────────────────┤
│ 高精度(毫秒级) │
│ ├─ 成本:高 │
│ ├─ 适用:秒杀倒计时 │
│ └─ 方案:时间轮 │
│ │
│ 中精度(秒级) │
│ ├─ 成本:中 │
│ ├─ 适用:订单超时 │
│ └─ 方案:Redis ZSet │
│ │
│ 低精度(分钟级) │
│ ├─ 成本:低 │
│ ├─ 适用:定时任务 │
│ └─ 方案:数据库轮询 │
└─────────────────────────────────────────┘决策 3:可靠性保证
问题: 如何保证可靠性?
可靠性方案:
# 三级可靠性
可靠性级别:
├─ L1:单机 + 定期备份
│ └─ 适合:非关键任务
│
├─ L2:主备 + 实时同步
│ └─ 适合:关键任务
│
└─ L3:分布式 + 多副本
└─ 适合:核心业务决策 4:扩展性设计
问题: 如何支持水平扩展?
扩展方案:
┌─────────────────────────────────────────┐
│ 扩展性方案 │
├─────────────────────────────────────────┤
│ 存储扩展 │
│ ├─ Redis Cluster │
│ ├─ 数据库分片 │
│ └─ 消息队列分区 │
│ │
│ 计算扩展 │
│ ├─ 增加消费者节点 │
│ ├─ 任务分片调度 │
│ └─ 负载均衡 │
│ │
│ 网络扩展 │
│ ├─ 多机房部署 │
│ ├─ 就近访问 │
│ └─ 降级策略 │
└─────────────────────────────────────────┘决策框架
CAP 权衡
延时队列的 CAP 权衡:
一致性(Consistency):
├─ 任务不能重复执行
├─ 任务状态一致
└─ 推荐:最终一致性
可用性(Availability):
├─ 服务始终可用
├─ 任务不丢失
└─ 推荐:高可用
分区容错(Partition Tolerance):
├─ 网络分区时继续工作
├─ 故障自动恢复
└─ 推荐:支持分区容错
选择:AP 或 CP
├─ AP:可用性和分区容错(推荐)
└─ CP:一致性和分区容错