标准答案
- 延迟消息适合大量相对独立、按消息到期触发的任务,但要处理重复投递、取消和消费积压。
- 定时任务适合固定周期的批处理或汇总,需解决多实例重复执行、分片和失败重跑。
- 数据库轮询实现简单、状态可查询,适合中小规模或必须从数据库状态触发的任务,但要控制扫描索引和锁竞争。
- 高价值任务应保存任务状态、执行次数和最终结果,不能把消息到期视为业务已经完成。
题目解析
延迟消息适合大量独立到期任务,定时任务适合固定周期和批量编排,数据库轮询适合规模有限且任务状态就在数据库中的场景。三者都只负责触发,不自动保证业务执行成功。
精度、任务量和取消需求决定实现成本。轮询要使用到期索引、批量领取和租约,延迟消息要处理重复投递和积压,定时任务要处理多实例重复和故障接管。
任务必须保存状态、执行次数、到期时间和最终结果。超时或消息投递成功后仍可能执行失败,调用方需要查询、重试或补偿路径。
常见误区
- 误区:把一次消息投递当作业务执行成功。改正:消息只表示触发或受理,最终状态要由消费者和业务记录确认。
- 误区:多实例定时任务没有幂等或租约。改正:使用共享协调、分片或幂等状态,处理重复触发和实例崩溃。
- 误区:轮询没有按到期字段建索引。改正:按状态和到期时间建立合适索引,并用批量领取降低扫描和锁竞争。