← 返回 Day 190 正文

Day 190 · 练习与清单

Day 190 练习与完成清单

所有命令都在 days/day-190-scheduled-inspection-alerting/ 下执行。 每个脚本都支持离线自检,不需要网络或外部服务(Docker 部分除外)。


✅ 完成清单(照着敲,逐条打勾)

A. 调度(离线,约 1 分钟)

B. 幂等(离线,约 10 秒)

C. 告警降噪(离线 + 真 HTTP)

D. 端到端验收(离线 + 真 HTTP)

E. 一键部署(需要 Docker)

F. cron 重叠(可选,需要能改 crontab)


练习 1(基础):把"跑完再睡"改成锚点网格

文件:新建 code/my-fixed-rate.py

要求:不看 01,自己实现 next_fire(anchor, slot, interval, jitter):

  1. 连续 1000 个 slot,偏移绝对值不超过 interval * jitter
  2. 同一 slot 调 100 次结果完全一致(不允许直接 random.random())
  3. 打印第 1/500/1000 个 slot 的时刻

验收:

bash
python3 code/my-fixed-rate.py | tail -3

练习 2(基础):给告警漏斗加可选指纹策略

文件:code/03-alert-dedup.py

现在指纹是 rule|asset。改成 fingerprint=strategy,支持三种:

要求:用 --self-test 证明 rule+asset 下 critical 仍 20/20, 且消息条数不超过 10。


练习 3(进阶):实现静默窗口 API

文件:code/03-alert-dedup.py

新增方法 silence_asset(prefix, until_ts, reason):

  1. 按资产前缀匹配(10.0.1.*)
  2. 静默期内只累加计数,不发送
  3. 静默结束后,第一条消息里带「静默期间共 N 条被抑制」
  4. 自测:静默 3 条 → 到期后第一条消息包含 N=3

练习 4(进阶):给 worker 加跨轮去重

文件:deploy/app/worker.py

现状:worker 每轮把变更直接投递(sink 的 duplicates=3 就是这么来的)。

要求:

  1. 用 SQLite 表 alert_state(fingerprint PRIMARY KEY, last_sent REAL, last_sev TEXT)
  2. 同指纹 60s 内重复不发;severity 升高必须发
  3. 在 README 补实测:改前 duplicates=X,改后 duplicates=0 且 critical 不丢

练习 5(挑战):让部署脚本支持回滚

文件:deploy/deploy.sh

要求:

  1. up 前把当前镜像 tag 记到 .last-good
  2. up 失败(health 超时)自动 down 并恢复上一个 tag
  3. 新增 rollback 子命令
  4. 用"故意把 sink 的 /health 改成 500"验证回滚真的触发

自测记录表(打印出来填)

项目 命令 期望 实际 通过
调度自检 01 --self-test 5 PASS ☐
幂等自检 02 --self-test 6 PASS ☐
降噪自检 03 --self-test 7 PASS ☐
翻车复现 04 --self-test 5 PASS ☐
端到端 05 --e2e ACCEPTED / exit 0 ☐
部署 deploy.sh up 收到 ≥1 告警 ☐
清理 deploy.sh down 端口释放 ☐