消息确认、重试、幂等与故障处理
WebSocket、消息队列与实时通信#Python全栈#第十六阶段#WebSocket、消息队列与实时通信#消息确认、重试、幂等与故障处理约 878 字 · 3 分钟阅读
追问显示点击任意追问卡片可收起 / 展开
Publisher Confirm 与消费者 ACK 各确认哪一段流程?
追问 怎样分别跟踪发布、入队、处理和数据库提交?消息到达 Broker 之后,为什么仍然可能尚未产生业务结果?
消费者自动确认与手动确认适合什么场景?
追问 处理前确认和数据库提交后确认各有什么失败窗口?怎样避免为了吞吐提前确认,却在进程退出后丢掉尚未完成的工作?
ACK 的 Delivery Tag 为什么需要与 Channel 一起理解?
追问 重连后能否在新 Channel 上确认旧投递?multiple 确认在并行处理时有什么风险,怎样避免确认尚未完成的消息?
prefetch 如何影响未确认消息数量和消费者负载?
追问 设得过大或过小分别有什么表现?怎样结合耗时、并发和内存调节,为什么它不是业务幂等或全局并发上限的替代品?
消费失败时,ACK、Reject、Nack 与 requeue 怎样选择?
追问 参数错误、临时服务故障和永久失败应采用相同策略吗?为什么立即反复 requeue 可能形成热循环并拖累正常消息?
怎样实现有限重试与死信处理?
追问 重试次数、延迟、死信路由和人工恢复怎样设计?重新投递成功后再确认原消息的流程有哪些重复窗口,怎样核对所用队列类型的死信可靠性?
“至少一次”和“至多一次”交付各意味着什么?
追问 消费者提交数据库后、确认前退出会出现什么?为什么消息可能再次到达,需要怎样验证业务副作用只发生一次?
怎样用数据库约束与事务实现消费幂等?
追问 事件标识应如何定义业务范围?去重记录和业务修改怎样一起提交,外部发信或支付操作为什么还需要额外确认与对账?
数据库提交与消息发布无法一次原子完成时,怎样使用 Outbox?
追问 事件和业务记录如何在同一事务保存?分发器确认发布后如何更新状态,重复分发及通知延迟怎样进入恢复与监控?
发布确认超时后,怎样决定是否重发消息?
追问 如何区分明确失败与结果未知?使用同一事件标识重发怎样配合消费者幂等,持久化和发布确认为什么不能单独证明永不丢失?
确认核对资料: RabbitMQ:Consumer Acknowledgements and Publisher Confirms。