确认、重试、幂等与故障恢复
Redis、缓存与异步任务#Python全栈#第十五阶段#Redis、缓存与异步任务#确认、重试、幂等与故障恢复约 820 字 · 2 分钟阅读
追问显示点击任意追问卡片可收起 / 展开
早确认与 acks_late 分别怎样影响任务失败?
追问 取到任务、开始执行、完成业务和确认之间有哪些窗口?Worker 子进程退出时,还需核对哪些拒绝或重新入队设置?
至少一次与至多一次处理分别意味着什么?
追问 重复执行和丢执行如何权衡?为什么配置延迟确认不等于得到业务上的“恰好一次”?
怎样让任务可幂等执行?
追问 唯一业务键、条件更新、状态机与外部接口幂等参数怎样组合?先查“未处理”再执行为何仍存在并发竞态?
哪些失败适合 retry,哪些应立即结束?
追问 临时网络错误、429、参数错误和权限不足如何区别?重试次数、退避、抖动和最终失败通知怎样设计?
Celery retry 与普通重新投递有什么差别?
追问 任务标识、异常信号和后续代码执行怎样变化?autoretry 范围过宽为何可能反复执行程序缺陷或不可重复副作用?
数据库提交与投递任务之间怎样避免丢任务或读取未提交数据?
追问 提交后投递能避免什么,仍会留下什么窗口?Outbox 怎样把待投递事实与业务变更一起保存,再可靠分发?
Redis Broker 的 visibility_timeout 如何影响重新投递?
追问 长任务、延迟确认与 ETA/countdown 在所用版本下怎样受影响?超时设置过短或过长分别可能产生重复和恢复迟缓,为什么不能靠调大值实现恰好一次?
任务网络超时、软时间限制与硬时间限制有什么区别?
追问 终止进程、捕获清理与底层调用超时怎样配合?并发池和操作系统支持为何需要核对,强制终止能否撤销已完成的远程操作?
revoke 与业务取消应该怎样区分?
追问 未执行任务和正在执行任务如何处理?强制终止为何可能误伤或破坏资源状态,任务如何在检查点配合取消标记?
任务执行完业务后、确认之前 Worker 退出,会发生什么?
追问 重新投递时怎样判断操作已经成功?数据库结果、文件写入与外部通知各怎样避免重复效果或提供对账依据?