后端、接口与数据 · 综合

队列与后台任务

一句话: 任何超过一秒、并且不是返回给用户所必需的操作,都属于队列,而不属于请求。

什么该挪到后台

发邮件和推送、生成报表、处理媒体、与外部系统同步,以及任何对一个你无法控制其可用性的服务的调用。

结果是:对用户的快速响应,以及韧性——当外部服务挂掉时,任务是在等待而不是失败。

每个任务的三条规则

可重复。跑两次不会产生重复。用每个操作一个唯一键来实现。

小。一个跑两小时的任务是一个你没法重试的任务。拆开它。

有上报。开始、结束、失败,以及重试次数。

会被忘记的部分

为反复失败的任务准备一个死信队列,并配告警——否则它们会静默消失。重试要用递增的延迟,以免把一个已经吃力的服务彻底压垮。还有顺序:如果顺序重要,就设分区键;如果不重要,就别假设有顺序。

深入一层

监控三个指标:队列长度、最老任务的年龄,以及失败率。队列长度在几天里缓慢上升,是大多数负载故障的早期症状,而且它出现得远早于任何用户有感觉的时候。