标准答案
- 活锁常见于多个执行者同时失败、同时让步、又同时重试,系统很忙但有效工作很少。
- 饥饿可能由不公平锁、优先级或队列策略造成,低优先级任务长期没有执行机会。
- 重试应加入随机抖动、退避、最大次数和优先级控制,并为失败任务保留可观察状态。
- 通过成功进度、资源等待分布、重试次数和任务年龄识别问题,而不是只看 CPU。
题目解析
死锁是不再前进的互相等待,活锁是持续动作却没有有效进展,饥饿则是某些工作长期拿不到资源。三者都可能让请求看起来“系统很忙”,但修复方向不同。
同时失败、同时让步、同时重试会形成同步振荡;不公平的优先级和锁策略则可能让低优先级任务永远得不到机会。需要记录成功进度和任务年龄,而不是只看执行器是否有活动。
退避、随机抖动、最大次数、优先级老化和保底配额可以降低风险,但仍要保证失败任务有最终状态。重试次数增加而成功进度不增加时,应快速止损。
常见误区
- 误区:所有失败立即重试。改正:按错误类型、剩余预算和下游容量使用退避、抖动和最大次数。
- 误区:只保证高优先级任务不饥饿。改正:为低优先级设置老化或最低配额,避免后台任务永久积压。
- 误区:把活锁误判成服务空闲。改正:比较重试量、有效完成量、任务年龄和状态变化,持续活动不等于持续进展。