You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何监控未按计划执行的作业/Worker并实现异常通知?

解决Worker静默未执行的监控告警方案

首先非常理解你的痛点——当大量Worker横跨小时到日级调度,出现无日志、无失败标记却不执行的情况,排查起来简直头疼,尤其是OOM这种直接把进程打没的场景,完全没痕迹。你提到的「用记录表跟踪启动信息+超间隔告警」思路其实非常靠谱,接下来我给你细化下落地的细节,让这个方案更实用:

一、核心设计:Worker心跳记录表

先设计一张极简的记录表(比如命名为worker_heartbeats),字段不用复杂,够用就行:

  • worker_id:Worker的唯一标识(建议用「任务名称+调度周期」的组合,确保全局唯一)
  • last_start_time:Worker最近一次启动的时间戳(用UTC时间避免时区混乱)
  • schedule_interval:该Worker的计划执行间隔(小时级存3600,日级存86400,单位为秒)
  • is_enabled:标记Worker是否启用(可选,用来排除临时禁用的任务,避免误告警)
  • updated_at:记录心跳更新时间(可选)

二、Worker端改造:自动上报启动心跳

每个Worker在真正执行核心逻辑前,必须执行一个原子操作更新这张表——一定要在启动初期上报,别等逻辑跑完再操作,不然OOM这种刚启动就挂的情况就捕捉不到了。

举个MySQL的SQL例子,用原子操作避免并发启动时的更新冲突:

INSERT INTO worker_heartbeats (worker_id, last_start_time, schedule_interval, is_enabled)
VALUES ('daily_user_sync', UNIX_TIMESTAMP(), 86400, 1)
ON DUPLICATE KEY UPDATE last_start_time = UNIX_TIMESTAMP();

为了减少重复代码,建议封装一个通用Worker基类,所有业务Worker都继承这个基类,基类在启动阶段自动完成心跳上报。新增Worker时直接继承就行,不用再写心跳逻辑,维护成本极低。

三、监控告警服务:定时检查超时Worker

单独写一个轻量的监控定时任务(比如每15分钟跑一次),执行以下逻辑:

  1. 查询worker_heartbeats表,计算当前时间与last_start_time的时间差:UNIX_TIMESTAMP() - last_start_time
  2. 筛选出时间差大于schedule_interval * 1.2的Worker(乘以1.2是给调度系统留一点缓冲,避免微小延迟导致误告警,比例可以根据你的实际情况调整)
  3. 对这些超时的Worker触发告警(邮件、企业微信、Slack等,选你们团队常用的工具)
  4. 额外记录告警日志,比如Worker ID、超时时长、告警时间,方便后续排查根因

四、进阶优化细节

  • 动态调整间隔:如果部分Worker的调度间隔会变动,可以让Worker启动时自动从配置中心拉取最新间隔并上报,或者监控服务直接从配置中心读取间隔值,不用修改数据库
  • 告警去重:同一个Worker连续触发告警时,设置冷却期(比如1小时内只发一次),避免轰炸
  • 历史排查:可以定期归档心跳记录,或者新增last_alert_time字段,标记上次告警时间,辅助分析Worker的稳定性

五、为什么这个方案比监听器更靠谱?

  • 监听器需要和每个Worker绑定,Worker数量多了之后,监听器本身的维护、故障排查都是负担;而心跳表是集中式管理,所有Worker的状态都在一张表里,监控逻辑统一,维护成本低
  • 不管Worker是因为OOM、机器宕机、调度系统漏发任务,只要没启动上报心跳,就能被精准捕捉——完美解决「无痕迹未执行」的核心问题

内容的提问来源于stack exchange,提问作者confused-perspective

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:19:35