Beacon 需要从多个地区同时探测用户的接口,Workers 天然适合:部署一次,到处都有节点。但“适合”不等于“没坑”。
坑一:探测请求被当成爬虫拦掉
不少用户的接口前面有 WAF。我们给探测请求带上固定的 User-Agent 和一个可公开查询的 IP 段说明页,用户一键就能加白名单。
坑二:Worker 的 CPU 时间不是墙钟时间
一次探测等响应可能要 8 秒,但这段等待不算 CPU 时间。反过来,解析一个大响应体才会真正吃 CPU。所以我们只读响应头和前 4KB,足够判断状态。
坑三:时间戳别信本地
多地区汇总时,各节点时钟有微小偏差。统一用中心节点收到结果的时间排序,节点上报的时间只用来算耗时。
坑四:重试要有上限,还要有间隔
const delays = [0, 1500, 4000];
for (const delay of delays) {
await sleep(delay);
const res = await probe(target);
if (res.ok) return res;
}
三次失败才算真的挂了,否则一次网络抖动就会让用户半夜收到告警。
坑五:告警疲劳
同一个故障每分钟发一次通知,用户很快就会把我们静音。现在是:故障开始通知一次,持续 30 分钟再提醒一次,恢复时通知一次。就这三次。
做监控产品最大的体会:少打扰用户,比多发现问题更难。