很多团队做SLA超时治理,第一版都是定时任务扫描数据库,超时就发通知,上线即巅峰,后面全是坑:工单挂起时还在傻跑计时、跨时区算错截止点、批量扫描把数据库拖垮。这篇文章把超时治理当作一个独立的技术域来拆,讲清楚时钟、升级、熔断、统计四个模块的设计原理,供做技术选型和自研的团队参考。
一、SLA时钟:计时对象到底是什么
第一个要想明白的问题:SLA度量的时间从哪一刻起、到哪一刻止。这里面的语义陷阱比多数人以为的多。
1. 三个基础时刻点
- 起点:常用工单创建时刻,更严谨的做法是状态转为待受理的时刻,两者在补录场景下会差异很大
- 终点:首次接单、首次响应、问题解决是三个不同终点,对应响应SLA和解决SLA两套指标
- 暂停点:等待客户补充信息、等待备件到货时,业务上通常要求计时暂停
2. 暂停与恢复的语义设计
暂停不是简单地把截止时间加一段时间。规范的设计是把工单的计时拆成若干时间段:每段有起止时刻和归属状态,SLA耗时等于各有效段之和。这样暂停期间发生了状态回退或改派,账目依然干净。用单一累计偏移量的实现,在多次暂停恢复叠加改派之后,几乎必然出现对不上账的工单,排查起来极其痛苦。
3. 工作日历必须进时钟
对外承诺次日九点前响应,遇到节假日怎么办。时钟模块要挂载工作日历:每个受理组可以绑定自己的日历(外包组周末不上班,值班组全年无休),计算截止点时按日历顺延。很多超时纠纷的根因,就是系统按自然时间承诺、按工作日历履约,两边口径对不上。
二、多级升级链:超时之后系统该做什么
检测到超时只是起点,动作编排才是治理的核心。成熟的实现里,超时触发的是一个升级策略对象,而不是一个通知动作。
1. 升级策略的典型分层
| 层级 | 触发条件示例 | 动作 |
| 提醒 | 达到时限的80% | 通知处理人,仅提示 |
| 升级 | 首次超时 | 抄送直属组长,工单标红 |
| 熔断 | 超时且未接单 | 自动改派或收回未分配池 |
| 报告 | 超时翻倍 | 推送管理层日报,纳入考核 |
注意动作要幂等。同一工单同一层级只允许触发一次,靠升级记录表加唯一约束兜底,不然定时任务重跑时组长会收到一串重复消息,可信度直接归零。
2. 熔断改派的边界条件
自动改派听起来痛快,实现上要小心三个边界:改派目标是否在线、目标负载是否已满、工单是否已被原处理人处理到一半。前两个查派单引擎的实时负载即可,第三个建议引入处理进度标记:接单后已有操作记录的工单不自动改派,只升级不熔断,避免把修到一半的活抢走。
三、检测机制:轮询、延迟队列还是时间轮
怎么及时知道哪些工单超时了,工程上有三条路线,各有适用规模。
1. 数据库轮询
定时任务每隔固定间隔扫一遍待处理工单表。实现最简单,量大之后问题最多:扫描间隔决定延迟上限,索引不合适就全表扫。日单量几千以内、且能接受分钟级延迟的,够用。
2. 延迟队列
工单创建时算好截止时刻,往延迟队列扔一个到期事件。时间精度高、无扫表压力,难点在于暂停恢复时要作废旧消息、投递新消息,消息的生命周期要和工单状态严格联动,否则会出现已关闭工单的到期事件还在队列里飞。
3. 分片时间轮
单机内存时间轮加分片持久化,性能最好,但引入了轮子重建、故障恢复的复杂度。除非日单量到了十万级,一般不建议先上这套,延迟队列加一层兜底轮询的混合方案更务实。
无论哪条路线,都保留一个低频兜底扫描(比如每十分钟一次),对账用。消息丢失、任务宕机总有发生的时候,兜底线保证超时事件最终会被发现,这是治理体系的最后一块砖。
四、超时统计:口径不清一切白费
技术实现之外,统计口径是另一个重灾区。同一张超时报表,两组人算出两个数,多半栽在下面几个定义上。
1. 必须写进文档的四个口径
- 超时判定以哪个时钟为准:含暂停还是不含,建议统计口径与承诺口径分离存两列
- 恢复算不算:超时后处理完的单,计入超时率还是单独的恢复时长指标
- 跨日历顺延怎么展示:报表里的截止时刻是自然时刻还是日历换算后的时刻
- 重复升级怎么计数:一单触发三层升级,超时次数算一次还是三次
2. 存储设计建议
不要只存最终结果。每个工单保留一份时钟事件流:状态变更、暂停、恢复、升级各记一行,统计时按事件流重放。这样口径调整时可以重算历史数据,而不是每次改定义都从零开始积累。事件流表按月分表,配合工单号做二级索引,几年的数据也不至于拖垮查询。
五、上线节奏与反模式清单
技术上再完备,落地节奏不对也会翻车。比较稳的路径是三步:先只记录不动作,跑两周校准时钟和口径;再开提醒和升级,暂缓熔断;数据证明升级链有效后,最后放开自动改派。
- 反模式一:上线即熔断改派,误伤一批正常在处理的单,一线集体抵制
- 反模式二:用自然时间对客户承诺、用工作日历对内考核,两边永远对不上
- 反模式三:暂停逻辑用偏移量硬加,改派叠加暂停后账目错乱,排查无门
- 反模式四:升级动作不幂等,任务重跑时消息轰炸,系统可信度崩塌
SLA超时治理的价值不在处罚多少人,而在让每一张工单的时间账目可信。账可信,承诺才敢对外写进合同,对内的效率讨论才有共同语言。技术方案围绕这个目标做取舍,就不会跑偏。
常见问题解答
- Q1Q1:SLA计时应该从创建时刻还是受理时刻开始?
- 对客户承诺的口径通常从创建时刻起算,内部考核建议从转为待受理的时刻起算,两者分开存。补录工单多的团队尤其要区分,否则响应时长会被历史单拉得虚高。
- Q2Q2:等待客户回复的时间要不要暂停计时?
- 业务上通常要暂停,否则处理人会被客户的沉默拖成超时。技术实现上建议用时间段模型而不是累计偏移,每次暂停恢复各记一段,多次叠加后账目依然可对。
- Q3Q3:定时任务扫描和延迟队列怎么选?
- 日单量几千以内、能接受分钟级检测延迟的,数据库轮询加好索引就够;单量大或要求秒级精度的,用延迟队列,但要处理好暂停恢复时的消息作废,并保留低频兜底扫描做对账。
- Q4Q4:自动改派误伤处理中的工单怎么办?
- 在改派条件里加处理进度判断:接单后已有操作记录的工单只升级不熔断。另外升级动作要幂等,同一层级只触发一次,避免任务重跑时重复改派。
- Q5Q5:超时率报表两个部门数字对不上怎么排查?
- 先对四个口径:计时含不含暂停、超时后恢复的单算不算、截止时刻用不用日历顺延、重复升级计几次。把口径写成文档并在报表页脚注明,绝大多数分歧出在这四项的定义上。