← 返回博客

用 Workers 做多地区探测,踩过的五个坑

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 分钟再提醒一次,恢复时通知一次。就这三次。

做监控产品最大的体会:少打扰用户,比多发现问题更难。