外观
重试、幂等与去重
核心答案:重试是再尝试一次,幂等是重复请求不重复产生预期之外的业务效果,去重是识别并抑制重复工作。 三者有关联,但去掉重复消息不代表外部副作用已安全处理。
对照一个素材请求
| 问题 | 机制 | 仍然存在的边界 |
|---|---|---|
| 网络暂时失败 | 有上限的重试与退避 | 请求可能已被供应商执行 |
| 同一版本被重复提交 | 唯一键或幂等键 | 相同键的参数必须一致 |
| 多个 worker 抢到任务 | 锁、租约与领取令牌 | 旧 worker 可能仍在执行 |
| 外部成功但响应丢失 | 请求 ID 查询与结果核对 | 服务不支持查询时可能需人工处理 |
Amazon 的幂等 API 设计文章讨论了客户端请求标识与重复调用。应用不能仅凭“超时”推断请求没有发生。
最小例子:相同意图,稳定标识
python
import hashlib, json
def intent_key(version, kind, payload):
raw = json.dumps([version, kind, payload], sort_keys=True,
ensure_ascii=False, separators=(",", ":"))
return hashlib.sha256(raw.encode()).hexdigest()
first = intent_key(2, "tts", {"text": "你好", "voice": "A"})
assert first == intent_key(2, "tts", {"voice": "A", "text": "你好"})
assert first != intent_key(3, "tts", {"text": "你好", "voice": "A"})哈希让参数顺序不影响键,但哈希本身不会锁住数据库,也不会让供应商自动幂等。实际任务必须用唯一约束或等效原子机制,而非先查询不存在再插入。
教材项目的执行策略
重试应区分可恢复的限流、连接问题,与不可恢复的鉴权、参数和权限错误;配置最大次数并记录下次尝试时间。结果不明需要保留独立状态,不能偷偷替换演示素材。
内容变更后,新版本建立新的任务关系;复用旧文件时也需核验输入指纹和文件完整性。完成任务时比较租约令牌与当前目标版本,防止旧执行者迟到后覆盖新结果。这是本次系统的可靠性目标,具体执行证据见系统架构关联的测试说明。
自测与排障
运行例子后修改 voice,键应变化;再说明图片的尺寸、模型和提示词是否也应参与指纹。进一步讨论为什么只用章节 ID 作为键会错误复用已经过期的音频。
遇到重复扣费时,按“业务意图 ID → 任务尝试 → 外部请求 ID → 结果落库”追踪。不能只在日志中搜索报错,也不能用无限重试掩盖结果不明。
官方资料与版本边界
- AWS Making retries safe:请求身份、相同意图与重复执行。
- AWS Transactional outbox:事件可能重复,消费者仍需处理幂等。
- PostgreSQL Constraints:唯一约束是数据库并发控制的一部分。
核验日期:2026-11-03。这些是通用工程原则,不代表每家图片或 TTS 服务都支持幂等键、查询或取消。无法确认的外部结果必须报告实际限制。