
陆续到达的相似信件,归进已经挂出去的那个邮袋。
这是《Flashduty AI SRE 技术揭秘》第 23 篇。查看 SRE Agent 架构与工程实践系列,或先读父子 Agent 通信。文中的阈值和窗口是我们设计时采用的参数,实际配置可能随产品迭代变化。
真实的值班场景里,告警从来不是孤立到来的。一次数据库故障扇出三十条告警,分属不同的服务、不同的告警规则。如果每条告警各自触发一次根因分析,你会得到三十个 agent 在分析同一件事——烧三十份 token,产出三十份可能互相打架的结论。
我们的解法是 fan-in(扇入):后来的相似事件不开新分析,并入正在进行的那个。这篇讲它的三个参数:怎么判定"是不是同一件事"、一次分析最多吸收多少、刚完成的分析还能不能加入。这三个参数都是产品 sense 落成工程数字的例子。
核心要点
- 问题: 告警风暴中,相似事件各自启动根因分析会重复消耗资源,也可能产生多份互不一致的结论。
- 做法: 将满足相似度与容量条件的新事件路由到已有分析;文中介绍的设计包括 0.9 相似度阈值、完成后 10 分钟窗口和单次 20 个事件的上限。
- 边界: 路由不等于平台已合并告警,也不证明事件根因相同;判定失败时降级为新建分析。这些参数应结合实际负载重新评估。
判定:平台决定,不是渠道决定
新告警事件到达、准备启动分析时,先做一轮判定:把这个事件和"正在接受分析的事件集合"逐一算相似度——用的是智能告警分组的同一套向量,阈值 0.9,就是分组功能的默认门槛。
阈值复用分组的是刻意的:“两次分析是不是同一件事"应该由平台的同一个标准回答,而不是告警渠道自己另立一套。如果分组的判定和 fan-in 的判定不一致,用户会看到"平台把它们分在一组、却各分析各的"这种自相矛盾。相似度服务不可用、判定过程出任何错,一律降级为正常开新分析——fan-in 是优化,永远不该成为启动分析的障碍。
候选集合也值得说:不只"正在跑的"分析,还包括刚完成不久的。
10 分钟窗口:风暴比单次分析活得久
已完成的分析保留 10 分钟的"可加入"窗口。我们当时观察到的生产数据有两个中位数:一次告警风暴的跨度约 10 分钟,而一次分析的运行时长约 5 分钟。这个比较支持为刚完成的分析保留加入窗口:一次分析跑完后,同一风暴中的后续事件仍可能到达。
这里没有列出统计窗口和样本数量,这组中位数只能作为当时的设计背景,不能用来推断其他环境的分布;设计自己的窗口时,应结合告警风暴持续时间和分析耗时重新测量。
窗口还有一个对称的反面:重投递来的旧事件,如果发现目标是 20 分钟前建立的旧记录,不再去唤醒那个旧会话——隔夜的重放不该惊动任何人。
20 的上限:再多,就不是"一次分析"了
单次分析最多吸收 20 个事件。理由一句话:每个事件都拖着它自己的告警群和上下文进来,超过这个数,一次分析就不成其为一次分析了——它变成了对整个风暴的综述,agent 的注意力被摊薄到每个具体事件都得不到深挖。
超限的行为不是拒绝,是"毕业”:满了的分析退出候选集,后来者开一个新分析,新分析自己继续吸收。所以 20 是单次分析的容量,不是风暴的容量——一场大风暴会自然分裂成几个各自吸饱的分析,每个都保持可读的规模。
吸收的形态:被路由,不是被合并
被吸收的事件不会跑自己的分析:它的任务记录直接落成终态,带一个指向目标分析的指针和完整的判定留痕(相似度分数、目标会话——历史记录必须自包含,不能靠将来现查)。对正在分析的 agent 来说,它收到的是一条系统通知消息——和第 4 篇的子任务完成通知是同一类消息,享受同一套语义:多条并入通知在队头连续时会合成一轮喂给 agent,不打断正在进行的分析。
这条通知的措辞里有一个刻意的诚实声明:“被路由进来,不是被合并”——平台侧没有合并任何告警,agent 正在分析的主事件也没变。通知同时把两种走向都交代清楚:如果新事件和当前分析共享根因,就在结论里显式覆盖它、回帖一条交叉引用;如果不共享,就派个子 agent 单独分析(第 4 篇的机制在这里复用)。判定的责任留给看到全部上下文的那一方。
可靠性上的几个数字也都是被风暴的形状逼出来的:同一条规则的并发事件可能落在不同消息分区、被不同机器处理,所以判定和落行在每规则一把锁里串行——但锁拿不到照样开新分析,“锁从不丢告警”;并发下两个相似事件共享一个分析有测试守着;并入通知的投递会重试几次——风暴里目标会话可能比指向它的记录晚几百毫秒建成;重复投递有幂等键,重复即空操作。

一次并入判定:候选、相似度、容量,三道都过才进门。
小结
这篇没有一个"算法",只有一组参数和它们的依据:0.9(复用分组标准,平台级一致)、10 分钟(风暴跨度中位数)、20(单次分析的语义容量)、每规则一把锁(分区的形状)、重试三次(会话建立的毫秒级时差)。产品 sense 的价值不在于想出这些数字,在于每个数字都能回答"为什么是这个值"——答不上来的参数,就是下一个事故的伏笔。
下一篇是本系列技术篇的收尾:聊聊 agent 记忆这个被过度神话的话题。