设想一家繁忙的医院病房:几十位病人同时接受着不同治疗,护士站的大屏幕实时闪烁着每位病人的心率、血压和血氧。监护仪一旦发现异常,警报立刻响起,值班医生闻声而动,迅速处理。这一切,都建立在“时刻看得见每一条生命体征”的基础上。 在AI平台的后台世界里,同样上演着类似的场景——成千上万个异步任务(数据清洗、模型训练、文件转码、消息推送)正像病人一样各自运行、各自结束。如果没有一套监控体系,这些任务就像脱离监护的病人:成功了没人知道,失败了没人发现,卡住了更无从察觉。异步任务监控,正是AI平台的“护士站与监护系统”,它让我们实时掌握每个后台任务的“脉搏”,在异常来临的瞬间做出响应。
对AI从业者而言,学会设计任务监控体系,等于拥有了随时“看得见系统运行”的第三只眼睛——这是从“写完代码”走向“运维好系统”的关键分水岭。
可视化演示
动态演示异步任务监控的核心机制,通过入门/进阶/实战/优化四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
异步任务监控:异步任务 异步任务监控体系架构设计 任务状态追踪与生命周期管理 核心机制可视化 异步任务监控整体架构与关键组件
监控体系设计
医院在搭建病房监护系统之前,护士长第一件事不是买监护仪,而是先明确三个问题:哪些病人需要重点监护?每种病要盯哪些指标?不同病情的病人该住哪一区?监控体系设计的第一课,就是对这些“对象、指标、层次”的规划。
AI平台里的异步任务就是“病人”——数据清洗、模型训练、文件转码、消息推送,各有各的“病情”。一个平台每天可能产生数十万计的任务,如果让所有任务都接受同样细度的监控,就像给普通感冒的病人也装上ICU的床旁监护仪——资源浪费且难以聚焦。因此首先要划分监控对象:核心链路任务(如支付结算、模型推理)归为“重点病人”,低风险任务(如日志归档)归为“普通病人”。
监控指标则是“生命体征”:任务成功率、平均耗时、重试次数、排队等待时长,这些指标刻画了任务从进入系统到结束的“健康曲线”。监控层次分三级:任务级(单个任务的状态)、队列级(任务队列拥堵程度)、系统级(整体资源水位)。最后,监控探针承担“采集体征”的职责——它是一段轻量级代码,埋入任务生命周期关键节点(开始、结束、失败、重试),把状态变化上报给监控中心。
当任务成功率、平均耗时这些“体征”都被明确定义后,监控体系就像医院的病房规章一样,知道该看谁、看什么、用什么看。有了这张蓝图,后面的状态追踪、异常告警才有落脚点。
- 分子 \(N_{\text{succ}}\)统计周期内成功完成的任务数量,对应医院痊愈出院的病人数。
- 分母 \(N_{\text{succ}} + N_{\text{fail}}\)成功与失败任务的总和,即所有已有结论的任务数量,相当于所有完成治疗的病人。
- 比值 \(P_{\text{succ}}\)分子除以分母得到成功率。若成功率长期低于预警线,说明系统或任务设计存在隐患。
状态追踪机制
每一位住院病人都有病历卡:几点入院、何时手术、现在住在哪床、病情是好转还是恶化。护士每次巡房都会在病历上更新记录。异步任务的状态追踪机制,就是这份实时更新的“电子病历”。
状态机建模是第一步。一个异步任务通常经历五种状态:排队、运行中、重试中、成功、失败。其中成功和失败是“终态”,好比病人痊愈出院或病危转院;排队、运行中、重试中是“中间态”,任务会在这几个状态间流转。
状态存储决定病历放在哪里。实时性要求高的场景用 Redis 保存任务当前状态,因为读写延迟在毫秒级;历史分析的需求则写入数据库,供后续生成趋势报表。心跳上报是任务定期向监控中心发送的“我活着”的信号——如同护士定时测量脉搏。心跳间隔一般设置为任务超时阈值的三分之一,既不会太频繁造成浪费,也不会太稀疏导致发现延迟。状态流转则由监控中心统一管理:任务启动时从排队转为运行中,异常时从运行中转为重试中,重试次数超限则转入失败。
有了这套“病历”系统,每个任务从提交到结束的每一步都清清楚楚。当任务状态出现异常时,监控中心就能立刻察觉,而不是等任务“静悄悄死掉”才发现。
- 集合 \(S\)任务状态全集,不论什么任务体系,都能浓缩为这几个有限状态,便于统一管理。
- 中间态排队、运行中、重试中,任务在这三个状态之间流转,对应病人的候诊、治疗和观察期。
- 终态成功和失败是吸收态,进入后不再流转,除非重新提交任务。
异常检测告警
病房里的监护仪之所以有价值,是因为它能自动判断“曲线不对”并发出警报,而不是等护士肉眼发现。异步任务的异常检测告警机制,就是这个自动判断的“警报系统”。
最常用的检测手段是超时判定:监控中心记录每个任务最后一次心跳的时间,如果当前时间与最后心跳的差值超过设定阈值,就判定任务超时。卡死检测是对超时的补充——有些任务心跳还在发,但进度毫无变化,像是病人意识清醒却停止了呼吸,需要用“进度是否推进”来判断是否卡死。失败识别相对直接:任务主动上报异常退出,或抛出未被捕获的错误,监控中心将其标记为失败。
异常检测的难点不在“发现”,而在告警收敛。一个任务失败了,可能触发几十条关联告警,值班人员被淹没在信息洪流中。告警收敛的做法包括:同类告警聚合成一条摘要、同一任务短时间内的重复告警自动合并、告警按责任分组路由到对应团队。这相当于医院里不因为一个病房亮灯就把全院的护士都叫来,而是只通知对应病房的责任护士。
异常检测让“生病”的任务在第一时间被识别,告警收敛让识别结果准确送达。但监控体系的最终目标不是“发现问题”,而是“解决问题”——这正是自动恢复机制的用武之地。
- \(t_{\text{now}}\)当前时间,时钟不断前进,对应护士看表的“现在时刻”。
- \(t_{\text{last\_heartbeat}}\)任务最后一次心跳的时间戳,对应病人最后一次被监护仪记录到心跳的时刻。
- \(\Delta t > T_{\text{limit}}\)静默时长超过阈值则触发告警,意味着任务可能已卡死或宕机,需要立即处理。
恢复与重试机制
急诊医生面对病人突发状况时有一套流程:先评估严重程度,轻则观察用药,重则紧急手术;如果用药无效,会换方案而不是盲目加倍剂量。异步任务的恢复与重试机制,正是这套“急救流程”。
延迟重试是最基础的恢复手段。任务失败后往往是因为依赖的服务瞬时抖动,等待片刻后重试即可成功。为防止重试本身压垮系统,通常采用指数退避:第一次重试等 0.5 秒,第二次等 1 秒,第三次等 2 秒,间隔呈指数增长。异常降级针对的是无法通过重试解决的故障——比如依赖的第三方服务宕机,此时任务返回降级结果(如缓存数据)而不是继续阻塞等待。
补偿恢复用于处理“部分成功”的尴尬局面:一个分布式任务分成了几个子步骤,前几步成功、后几步失败,需要执行反向操作(如回滚已写入的数据)将系统恢复到一致状态。熔断保护则是最后的安全阀:当某个下游依赖失败率达到阈值,熔断器自动打开,短时间内不再发起新的调用,避免故障像多米诺骨牌一样连环倒塌。
自动恢复机制让任务系统具备了“自愈能力”。但恢复是否成功、系统的整体健康状况如何,还需要一面“镜子”来呈现——这就是可视化监控台。
- \(t_{\text{base}}\)基础等待时间,例如 0.5 秒,相当于急救给药的基础剂量。
- \(n\)当前重试次数,第1次取 1,第2次取 2,依次递增。
- 指数因子 \(2^{(n-1)}\)每次重试等待时间翻倍,1、2、4、8……让失败的请求逐渐疏散,避免雪崩。
- 整体乘积基础时间乘以指数因子,得到本次重试前的等待时长。
可视化监控台
护士站的大屏幕上,全院病床的状态一目了然:几床在手术、几床在观察、几床即将出院。运维人员的可视化监控台就是这样的大屏,将海量的任务状态浓缩成可读的图表。
实时态势是监控台的核心区域,用折线图、柱状图或仪表盘展示当前正在运行、排队、成功、失败的任务数量,每分钟刷新一次。趋势报表则回答“系统是在变好还是变坏”——过去 24 小时的成功率曲线、平均响应时间趋势、重试次数分布,帮助运维人员发现慢性退化,而不是只盯着突发故障。任务详情支持从报表下钻到单个任务:它的完整生命周期、每次心跳的时间、失败时的堆栈信息,如同医生的病历详细记录了每一次用药和反应。
统计指标是监控台的“体检报告”,通常包含:任务成功率、平均执行耗时、P95/P99 耗时、重试率、队列积压量。这些指标不仅反映当前状态,更是容量规划和性能优化的数据依据。
可视化监控台让运维人员对系统状态“一眼掌控”。但监控台只是“看”的手段,真正让问题被及时响应的,是背后那条完整的告警通知链路。
- \(t_{\text{start},i}\) 与 \(t_{\text{end},i}\)第 \(i\) 个任务的开始和结束时间戳。
- \(t_{\text{end},i} - t_{\text{start},i}\)单个任务的总执行耗时,对应病人的住院天数。
- 求和平均对所有任务的耗时求和后除以任务数 \(N\),得到平均耗时。
告警通知体系
病房里最紧急的声音是呼叫铃——病人按下按钮,护士站立刻显示床位号,并根据紧急程度决定是派护士还是呼叫医生团队。异步任务的告警通知体系,扮演的正是这个“分级呼叫铃”的角色。
阈值设置是告警的触发开关。成功率低于 95% 触发警告,低于 90% 触发严重告警;任务静默超过 2 分钟触发超时告警,超过 5 分钟触发致命告警。阈值不是拍脑袋定的,而是根据历史数据的基线动态调整。通道分级决定告警用什么方式送达:P0 级(系统不可用、核心任务大面积失败)用电话+短信,P1 级(局部故障、单任务反复失败)用即时通讯推送,P2 级(轻微异常、不影响核心流程)发邮件即可。
升级策略解决“没人响应”的问题:一条 P1 告警发出后 5 分钟无人确认,自动升级为 P0 并电话联系值班负责人;若 10 分钟仍无响应,继续升级到团队主管。值班处理则是告警的最终落脚点——每个告警都必须有明确的负责人(on-call),值班人员收到告警后确认、处理、关闭,形成完整的响应闭环。
告警通知体系让“发现异常”和“有人处理”之间无缝衔接。但所有这一切,最终都要落到实际的工程实施中——监控体系本身如何搭建,又如何避免成为系统的负担?
- \(\Delta t\)从任务异常发生到当前的时间长度,对应护士判断“病人不适已持续多久”。
- 阈值 \(T_{\text{P0}}\) 与 \(T_{\text{P1}}\)两个不同级别的告警阈值,超过更严格的阈值就升级为更紧急的通道。
- 分段选择根据 \(\Delta t\) 落在哪个区间,选择不同级别的告警通知方式。
监控落地实践
医院要建一套监护系统,需要铺设线路、安装探头、培训护士、制定操作规范。异步任务监控的落地,同样是一项需要精细施工的工程。
埋点采集是施工的“布线”环节。在任务执行的关键路径上插入探针代码:任务提交时记录时间戳,运行时周期性发送心跳,结束时标记成功或失败。埋点设计要遵循“低侵入”原则——最好通过中间件、装饰器或 AOP 方式实现,不让业务代码感受到监控的存在。日志对接则将监控与日志系统打通:监控发现异常任务时,能自动关联到该任务在日志系统中的完整执行日志,省去运维人员手动搜索的麻烦。
性能开销是落地时最容易被忽视的坑。每条心跳都是一次网络请求,每次埋点都带来额外的 CPU 和内存消耗。如果每毫秒采集一次全量指标,监控系统本身的性能开销可能占到总资源的 10% 以上。合理做法是分级采样:核心任务全量采集,低优先级任务按比例采样。治理闭环是监控落地的最后一步:监控数据不能只躺在数据库里,要定期复盘——哪些告警是误报、哪些任务反复失败、哪些性能瓶颈反复出现,推动研发团队优化代码和架构。
监控体系的落地从来不是一次性的,而是建设、运行、复盘、优化的持续循环。就像医院的监护系统要不断校准设备、更新预案,异步任务监控也需要在每一次故障中打磨得更精准、更可靠。
- \(N_{\text{total}}\)待监控的任务总量,对应医院需要监护的病人总数。
- \(C_{\text{quota}}\)监控系统允许的最大采样配额,如每秒最多采集 1000 条心跳。
- \(\min(1, \cdot)\)若配额足够,采样率为 1(全量监控);若配额不足,按配额比例采样,保证监控自身不会拖垮生产系统。
AI 应用场景
大模型推理服务监控
阶段:模型服务化与运维监控
解决的问题:用户调用大模型 API 时,推理请求被放入异步队列等待 GPU 资源。传统方式下,如果某个推理节点卡死,用户端只能看到“请求超时”,故障定位要翻日志、查容器,耗时以小时计。通过异步任务监控,推理任务的状态、耗时和心跳被实时追踪,一旦节点心跳中断,监控系统自动告警并在 15 秒内将任务重新调度到健康节点。
具体案例:某 AI 创业公司的文生图服务,高峰期每天处理 50 万次推理请求。某次 GPU 驱动异常导致 30% 的任务在运行中卡死,监控系统检测到心跳丢失后立即触发 P1 告警并自动重启宕机节点,最终将任务失败率控制在 2% 以内,用户几乎无感知。
数据 ETL 流水线监控
阶段:数据工程与准备
解决的问题:ETL 任务通常被切分成数千个分片并行处理,任何一个分片异常都可能导致整体任务永远“挂起”。传统依赖定时检查点,异常发现滞后数小时。借助任务监控的状态追踪和自动重试机制,ETL 流程可在分片失败后自动重试,在重试超过阈值后仅对该分片执行降级跳过,保证整体任务按时产出。
具体案例:某大型推荐系统团队每天凌晨执行 12 小时的数据管道,覆盖 2 万个分片任务。引入监控体系后,管道完成率从 96% 提升到 99.5%,因任务卡死导致的数据迟到次数减少了 80%。
大模型训练集群监控
阶段:模型训练与调优
解决的问题:大模型训练往往持续数天甚至数周,单卡故障会导致训练停滞数千小时。训练任务的“心跳”信号是监控关键——如果某个训练 Worker 心跳中断,监控系统立即触发告警,结合补偿恢复机制将训练状态回滚到最近的检查点并重新拉起集群。
具体案例:某大模型公司训练百亿参数模型时,一条训练链路中的 GPU 发生显存错误。监控系统捕捉到心跳异常后自动触发熔断,暂停该链路的数据注入,同时通知训练值班工程师在 10 分钟内完成故障卡替换,训练整体中断时间控制在 30 分钟内。
Python 演示
import timeimport random class TaskMonitor: """异步任务监控器:追踪状态、检测超时、触发告警""" def __init__(self, timeout=2.0, max_retries=2): self.timeout = timeout self.max_retries = max_retries self.tasks = {} self.alerts = [] def submit(self, task_id): self.tasks[task_id] = { "status": "排队中", "retries": 0, "started_at": None, "last_heartbeat": time.time(), } def heartbeat(self, task_id): if task_id in self.tasks: self.tasks[task_id]["last_heartbeat"] = time.time() def mark_running(self, task_id): info = self.tasks[task_id] info["status"] = "运行中" info["started_at"] = time.time() info["last_heartbeat"] = time.time() def mark_success(self, task_id): self.tasks[task_id]["status"] = "成功" def mark_failure(self, task_id, reason=""): info = self.tasks[task_id] info["retries"] += 1 if info["retries"] > self.max_retries: info["status"] = "失败" self.alerts.append("[严重告警] %s 最终失败: %s" % (task_id, reason)) else: info["status"] = "重试中" self.alerts.append("[自动恢复] %s 进入第%d次重试" % (task_id, info["retries"])) def check_timeout(self): now = time.time() for tid, info in self.tasks.items(): if info["status"] == "运行中" and now - info["last_heartbeat"] > self.timeout: self.alerts.append("[超时告警] %s 心跳静默%.1fs" % (tid, now - info["last_heartbeat"])) self.mark_failure(tid, "心跳超时") def summary(self): stats = {} for info in self.tasks.values(): key = info["status"] stats[key] = stats.get(key, 0) + 1 return stats def execute_task(monitor, task_id): """模拟真实任务:心跳 + 随机失败""" monitor.mark_running(task_id) for step in range(5): monitor.heartbeat(task_id) time.sleep(0.2) if random.random() < 0.3: raise RuntimeError("第%d步异常" % step) monitor.mark_success(task_id) def run_with_retry(monitor, task_id): """带指数退避地执行任务,重试上限由监控器管理""" while True: try: execute_task(monitor, task_id) return except RuntimeError as e: monitor.mark_failure(task_id, str(e)) if monitor.tasks[task_id]["status"] == "失败": return n = monitor.tasks[task_id]["retries"] time.sleep(min(0.5 * 2 ** (n - 1), 8)) if __name__ == "__main__": random.seed(42) monitor = TaskMonitor(timeout=1.0, max_retries=2) for tid in ("task-001", "task-002", "task-003"): monitor.submit(tid) for tid in ("task-001", "task-002", "task-003"): run_with_retry(monitor, tid) monitor.check_timeout() print("== 告警记录 ==") for alert in monitor.alerts: print(alert) print("== 最终统计 ==") for key, value in monitor.summary().items(): print("%s: %d" % (key, value))
self.tasks[task_id] = {...}为每个任务建立包含状态、重试次数、心跳时间的“病历卡”submit` / `mark_running` / `mark_success对应任务状态机中的排队、运行中、成功三种状态heartbeat(task_id)任务周期性上报心跳,更新时间戳,作为超时检测的数据来源mark_failure(task_id, reason)失败时先判断是否超过最大重试次数,未超过则进入“重试中”check_timeout()扫描所有运行中的任务,发现心跳静默超过阈值就触发超时告警run_with_retry(monitor, task_id)执行任务并捕获异常,失败后按0.5 * 2^(n-1)秒退避重试random.seed(42)固定随机种子,确保每次运行结果一致,便于复现演示
常见误区
误区我觉得异步任务监控就是把每个任务多打点日志,出错的时候翻日志不就行了,没必要搞什么监控体系。
正解日志只是事后排查的原始材料,而监控体系是把状态、心跳、指标汇总成一条实时的感知链路。就像医院病房里,病历本不等于监护仪——病历本只能等医生翻看,监护仪却能在一瞬间发出警报。监控体系里的“状态机 + 心跳 + 告警”是自动感知,日志只是辅助定位的工具。
为何常见:日志是大家最熟悉的排障手段,入门门槛低,容易产生“看得见日志就等于看得见任务”的错觉。
误区监控埋点频率越高越好,任务状态每毫秒都上报,指标维度越全越好,这样什么异常都能第一时间发现。
正解监控本身也有成本:高频上报会消耗 CPU、网络和存储,如同给每个病人身上接几十根导线,病人动不了、护士也看不过来。合理做法是分层分级:核心任务高频采集,普通任务低频采样,数据保留时间按需求分冷热。就像可视化演示中的采样率公式所表达的——用可接受的配额,采集最有效的信息。
为何常见:刚接触监控的人容易把“更多数据”等同于“更多安全感”,忽略了边际收益递减和系统开销。
误区只要搭一个可视化监控大屏,让运维盯着屏幕看,任务出问题一眼就能看出来。
正解人的注意力无法 24 小时集中,大屏只是辅助决策的界面,真正的价值在自动检测和自动告警。就像护士站的大屏再清晰,如果没有报警铃,深夜值班护士也难以每时每刻盯着屏幕。监控体系的核心是“自动发现—自动告警—自动恢复”这条链路,可视化只是链路上的一环。
为何常见:可视化的反馈直接、效果好,容易让人高估人工盯屏的可持续性,低估自动化检测的作用。
误区任务失败后就要不停地重试,直到成功为止,因为临时故障总会过去。
正解无限重试是雪崩的源头:大量请求反复叠加,系统负载不断上升,反而把一个临时故障拖成系统性宕机。正确做法是限制重试次数并使用指数退避间隔,同时引入熔断保护——就像医生对反复室颤的病人不会无限按压,而是先停手评估,再决定是否电击除颤。熔断、降级、退避重试这些机制共同构成恢复策略,而不是只有“重试”这一招。
为何常见:“多试几次总能成功”符合日常直觉,容易忽略分布式系统中失败放大效应。
面试题
Q1. 异步任务监控中,“心跳上报”的核心用途是?
- A.定期报告任务存活状态← 正确答案
- B.提升任务整体执行速度
- C.完全替代日志记录能力
- D.自动修复业务代码缺陷
答案:A。心跳是任务周期性发出的“我还活着”信号,如病人监护仪上的脉搏。它让监控中心持续掌握任务的存活性,而不是依赖日志事后翻查。心跳是超时检测的基础数据,一旦缺乏心跳,说明任务可能卡死或宕机。
Q2. 监控体系设计时,“监控对象”的确定主要依据是?
- A.所有代码全部纳入无差别监控
- B.核心链路与关键异步任务优先← 正确答案
- C.只有耗时超过一天的异常任务
- D.只监控曾经成功完成的任务
答案:B。监控对象要按业务重要程度分层,把核心链路任务列为重点监护对象,普通任务降低监控密度,避免监控资源浪费。无差别全量监控既不经济也难以聚焦,和医院给所有病人上 ICU 级监护同理。
Q3. 关于监控埋点的设计原则,以下哪项正确?
- A.侵入业务代码,全面改造内部逻辑
- B.低侵入、轻量级、可观测性优先← 正确答案
- C.完全不需要记录任何任务数据
- D.只在出问题时临时临时添加埋点
答案:B。埋点要尽量不打扰业务代码,通过装饰器或中间件方式无感接入,同时保证采集开销足够小。若埋点需要大改业务逻辑或事后才想起打点,说明设计滞后且监控覆盖不可靠,与医院要求“探头安装不能影响病人治疗”同理。
Q4. 在异步任务状态机中,下列哪项属于“终态”?
- A.运行中
- B.重试中
- C.排队等待
- D.失败终结← 正确答案
答案:D。终态是指任务不再流转的状态,包括“成功”和“失败”。运行中、重试中、排队等待都是中间态,任务还会继续流转。把终态定义清楚,才能正确统计成功率、识别遗留任务,避免把已失败的任务误认为还在运行。
Q5. 指数退避重试策略的核心思想是?
- A.每次重试等待时间翻倍增长← 正确答案
- B.每次重试等待时间逐渐缩短
- C.所有重试间隔时间完全相同
- D.随机分配一个固定等待时间
答案:A。指数退避让等待时间按 0.5s、1s、2s、4s 依次翻倍,目的是让失败的请求逐渐疏散,避免短时间内所有重试同时涌向服务端造成雪崩。固定间隔或缩短间隔都会加剧系统负载,随机固定时间则失去平滑退避的意义。
Q6. 任务监控的状态存储选用 Redis 而非数据库,主要的考量是?
- A.高吞吐、低延迟的实时读写性能← 正确答案
- B.长久保存所有历史运行记录的容量
- C.完全替代业务数据库的全面能力
- D.具备复杂 SQL 查询和报表分析功能
答案:A。状态存储的核心是实时性——每次心跳、每次状态流转都需要快速读写,Redis 的毫秒级读写性能天然适合。历史分析和报表查询则交给数据库,两者各司其职,而不是让一种存储承担所有职责。
Q7. 熔断保护机制在异步任务监控中的作用是?
- A.任务失败后立刻熔断并重新排队
- B.达到阈值后暂停调用避免雪崩← 正确答案
- C.无限重试直到任务最终成功
- D.只对成功任务执行熔断判定
答案:B。熔断是当某个下游依赖的失败率达到阈值时,自动打开断路器,在短时间内不再发起新的调用,给依赖系统恢复的时间。它和无限重试相反,是主动“踩刹车”而不是“踩油门”,防止故障像多米诺骨牌一样扩散。
Q8. 告警收敛机制的目标包括哪些?
- A.减少重复无意义的告警通知← 正确答案
- B.将同类告警聚合为一条摘要← 正确答案
- C.让每条告警明确归属负责人← 正确答案
- D.尽可能多地发送告警信息
答案:ABC。告警收敛解决的是“告警轰炸”问题——把重复的、同源的告警合并成一条有价值的信息,并明确路由到对应负责人。过度发送告警只会让值班人员麻木,反而淹没了真正重要的告警,和医院呼叫铃不能把全院护士都叫来同理。
Q9. 下列哪些手段可用于检测后台任务的异常状态?
- A.心跳超时判定← 正确答案
- B.任务卡死检测← 正确答案
- C.日志关键字匹配← 正确答案
- D.全量代码自动编译
答案:ABC。心跳超时发现任务是否停止上报,卡死检测发现任务是否进度停滞,日志关键字匹配定位具体错误原因,三者是不同粒度的异常检测手段。全量代码编译与运行状态无关,属于开发阶段的质量保障,而非运行时监控手段。
Q10. 当监控系统发现某异步任务持续失败时,合理的自动处理顺序包含哪些?
- A.触发告警通知值班人员介入← 正确答案
- B.立即无限次自动重试直至成功
- C.按指数退避间隔自动重试执行← 正确答案
- D.达到重试上限后自动熔断降级← 正确答案
答案:ACD。合理的恢复策略是组合拳:先按指数退避重试若干次,仍失败则触发告警通知值班人员,最终通过熔断降级保护系统整体稳定。无限重试是典型的错误做法,会放大故障影响。这与急诊的“观察→用药→手术”分级处置逻辑一致。