LabHub
学习 学习路径 课程

生产级后端 API 综合项目

把决策与事故变成不含机密的作品集

在 LabHub 中继续学习

一句话总结

ADR 保留做出决策时的上下文、备选方案、选择和结果;事故报告记录实际影响、时间线、根本原因、检测过程,以及有负责人的纠正措施。作品集不复制这些原始材料,只发布获准公开的摘要

概念图: 获准公开的摘要 · 寻找责任人的文档 · 时间线要包含时区,并区分三个时刻。 · “为什么 40 分钟内都没有发现”

为什么仅凭代码无法解释判断

ON CONFLICT 语句能说明选择了什么,却无法解释为何选择数据库边界,而不是仅由客户端去重。六个月后看到这段代码的人会做两件事中的一件:因为不知道理由而原样保留,或因为不知道理由而删除。两者都不好。

ADR(Architecture Decision Record) 会记录当时的约束、比较过的方案,以及预期成本。格式越短越好。

# ADR-014: 중복 제거를 DB 제약으로 옮긴다

- 상태: 채택 (2026-03-11)
- 맥락: 결제 웹훅이 재시도로 같은 이벤트를 최대 3번 보낸다. 클라이언트 쪽
  메모리 캐시로 걸렀는데 파드가 늘면서 캐시가 나뉘어 중복이 새기 시작했다.
- 대안:
  1. Redis 분산 락 — 새 의존성이 생기고, 락 해제 실패 시 결제가 멈춘다.
  2. 애플리케이션 조회 후 삽입 — 조회와 삽입 사이에 경쟁이 남는다.
  3. unique 제약 + ON CONFLICT DO NOTHING — 경쟁이 DB 안에서 끝난다.
- 결정: 3안. 멱등 키를 (provider, event_id) 로 두고 유니크 인덱스를 건다.
- 결과: 중복 결제 0건. 대신 삽입 지연이 p99 기준 4ms 늘었다.
- 되돌리는 조건: 삽입 지연이 p99 20ms 를 넘으면 재검토한다.

有“回滚条件”的 ADR 和没有这一条件的 ADR 是不同的文档。有条件,就能在以后测量并作出判断;没有条件,决定就会永久保留。

如何让事故报告成为学习记录

事故发生后,应通过事故报告回顾设计假设是否符合实际。它不应是寻找责任人的文档,而应是用于构建下一道系统安全措施的学习记录。为保持这一性质,需要几项约束。

时间线要包含时区,并区分三个时刻。

时刻 含义 数值较大说明什么
开始 用户影响开始的时间
检测 人员发现问题的时间 可观测性不足
恢复 影响结束的时间 响应流程缓慢

如果用了 40 分钟才检测到问题,那么无论根本原因是什么,**“为什么 40 分钟内都没有发现”**都应成为独立的纠正项。事故中有一半的改进来自这里。

根本原因应指向条件,而不是人。 不要写“某人部署了错误配置”,而应写“错误配置到达部署阶段的路径中缺少验证”。前一句无法阻止下一次事故,后一句可以。

纠正措施不能只是“以后注意”,而应包含负责人、期限和可验证的完成条件。

- [ ] values 스키마 검증을 CI 에 추가 (담당: 배포팀, 기한: 3/25)
      완료 조건: 잘못된 replicas 값을 넣은 PR 이 CI 에서 떨어지는 것을 확인
- [ ] 에러율 경보를 백엔드별로 분리 (담당: 관측팀, 기한: 3/20)
      완료 조건: 한 대만 죽였을 때 5분 안에 경보가 울리는 것을 확인

如何在实际工作中制作公开证据

招聘作品集中不要放入原始 Authorization 头、令牌、密码、私有 IP、内部 .svc.cluster.local 地址,或完整终端输出。事故报告原文可能包含客户名称和营收影响,ADR 也可能暴露内部系统结构。

应只挑选获准公开的证据发布。

不应放入的内容 替代内容
完整的 curl -H "Authorization: Bearer ey..." “6 项 HTTP 行为测试通过”
10.0.3.12, db.internal.svc “三层架构,数据库位于私有子网”
“A 公司支付中断 12 分钟,营收损失 3200 万韩元” “支付路径中断 12 分钟,影响规模不公开”
粘贴完整日志 指标名称列表和一张图表

固定模式版本并拒绝未知字段,防止后续工具误把原始秘密加入其中。

{"schema": "labhub.portfolio/v1",
 "evidence": [
   {"kind": "test", "name": "http-contract", "passed": 6, "failed": 0},
   {"kind": "image", "claim": "non-root, digest-pinned"},
   {"kind": "adr", "id": "ADR-014", "one_line": "중복 제거를 DB 제약으로 옮김"},
   {"kind": "incident", "id": "INC-2026-03", "one_line": "설정 검증 부재로 12분 중단"}
 ]}

additionalProperties: false 锁定模式后,只要有人为了方便添加 raw_log 字段,验证就会失败。让工具拦截,而不是依赖人的注意力。

实务判断标准

优秀的作品集展示的不是华丽截图,而是可复现的契约和判断能力。面试中真正会问的也是这些。

本课程最后的测验将确认实现、运维与文档证据能否串联成一个完整故事。