真正的实时推送需打通“任务执行—判断逻辑—通知通道”三环:任务须返回结构化结果而非仅日志;判断逻辑嵌入流程并分级告警;推送通道要低延迟、可回溯、带上下文,且必须建立失败重试与反馈闭环。

定时任务触发报警后,关键不在“跑完任务”,而在“结果立刻传出去”。真正的实时推送,需要打通“任务执行—判断逻辑—通知通道”这三环,缺一不可。
定时任务本身要能捕获执行结果
很多定时任务只管跑,不记录成败或异常细节。要推送,就得让任务明确返回状态和上下文。
- 在任务函数里主动抛出异常(如
raise Exception("DB connection timeout")),或统一返回结构化字典:{"status": "failed", "error": "timeout", "traceback": "...", "task_id": "xxx"} - 避免用
print()或日志埋点代替可编程的输出——日志难提取,无法直接用于推送逻辑 - 如果是分布式调度(如XXL-JOB、DolphinScheduler),启用其原生回调钩子(如
jobHandler.afterExecute()),在任务结束时注入推送动作
报警判断必须嵌入任务流程中
不是所有失败都要告警,也不是所有成功都需通知。得在任务内部或紧邻处做轻量级决策。
- 比如每分钟查订单超时数,若数量>50才触发告警;若只是0→1的微小波动,不推
- 区分告警等级:失败但可重试 → 仅记录;失败且连续3次 → 立即短信;失败伴随CPU满载 → 同时推企业微信+电话
- 推荐把判断逻辑写成独立函数(如
should_alert(result)),方便单元测试和复用
推送通道要低延迟、可回溯、带上下文
发出去≠送达。选通道要看场景,也要留退路。
-
前端实时感知:WebSocket 是首选。任务结果生成后,通过
async_to_sync(channel_layer.group_send)()(Django)或session.getBasicRemote().sendText()(Java)直推浏览器,支持弹窗+声音 -
移动端触达:iOS/Android 推送需走 APNs 或 FCM,务必带上
apns-priority: 10和mutable-content: 1确保前台/后台都能响 - 兜底渠道:邮件或企业微信机器人作为异步备份。注意邮件正文必须含时间戳、任务名、错误堆栈摘要(截取前200字符)、重试链接
- 所有推送都应附带唯一
alert_id,便于后续查日志、去重、关闭告警单
别忽略失败后的自愈与反馈闭环
一次推送失败,不能静默丢弃。系统得知道自己“没送出去”。
- 推送调用加超时(建议≤3秒)和重试(最多2次),失败则落库标记为
pending_push - 另起一个轻量级定时任务(如每5分钟扫一次
pending_push表),补推或升级通道(比如首次用微信,失败后改发短信) - 前端收到推送后,主动回传
ack,服务端更新告警状态为“已读”;超时未ack则触发二次提醒











