知识卡片
何时用定时任务、何时用消息中间件:四个判断维度
内容
定时任务(作业)和消息中间件在部分场景下可以互相替代(比如用极短间隔的定时任务轮询队列表,效果类似消息推送),但消息中间件的推送模式实时性更好、基于文件顺序追加的消息存储吞吐量也远高于基于数据库的队列表,所以能替代时通常优先选消息中间件。但两者在四个维度上存在不可替代的边界,判断该用哪个应该沿着这四个维度逐一检查:一是时间驱动还是事件驱动——内部系统一般能靠事件触发,但涉及外部系统时(比如抓取第三方网站价格),对方根本不会给你发事件,只能靠定时轮询这种时间驱动的方式;二是批量处理还是逐条处理——有些业务逻辑天生只能批量算(比如电商公司和快递公司按月结算、按月度总量计算阶梯提成),逐条处理消息中间件模型根本无法表达这种”按周期聚合后一次性计算”的语义;三是非实时还是实时——有些业务需求虽然可以做成实时触发,但业务上根本不需要(比如VIP用户超过一年无购买自动降级),用重量级的实时消息机制去处理一个本质上”什么时候执行都无所谓”的需求是过度设计;四是系统内部还是系统间解耦——作业通常封装在单个系统内部自行调度,而消息中间件的核心价值之一正是解耦不同系统之间的依赖,如果目的是让两个独立系统互不感知彼此存在,作业模型天然不适合。
参考来源
- 位置:《高可用架构(第1卷)》第2章《高可用架构原理与分布式实践》"2.6 新一代分布式任务调度框架:当当Elastic-Job开源项目的10项特性"节,"2.6.1 为什么需要作业(定时任务)"(源文件:_epub-src/OEBPS/Text/Chapter2_6_2.xhtml)
- 结论依据:原文列出"时间驱动/事件驱动""批量处理/逐条处理""非实时性/实时性""系统内部/系统解耦"四个维度并分别举例说明两者不能互换的场景,直接支撑本卡片的四维判断框架。
- 原始内容:时间驱动/事件驱动……批量处理/逐条处理:批量处理堆积的数据更加高效……非实时性/实时性……如VIP用户降级,如果超过一年无购买行为,则自动降级……系统内部/系统解耦。作业一般封装在系统内部,而消息中间件可用于系统间解耦。