第十站练习答案
ADR 示例
text
Decision: 当前工单台使用 WSGI。
Context: 请求均为短同步 CRUD;数据库驱动与中间件为同步;没有长连接。
Consequences: 部署路径成熟,阻塞调用边界清楚;未来真实长连接需求需重新评估 ASGI。
Rejected: 仅因 Django 支持 async 就切 ASGI;没有测量到收益,反而扩大混合栈。连接预算
4 个 worker × 每 worker 10 条连接 = 应用侧理论 40 条。还要为迁移、管理、任务 worker、监控和故障恢复预留连接,并确认数据库硬上限。池大小不是越大越好;它会把排队从应用搬到数据库。
可回滚迁移
如果本次只做向后兼容的新增列/表,保留 schema,回滚到旧应用并停止新批次;不要机械反向迁移删除新列。确认旧应用不会读取新状态,暂停不兼容后台任务,保留发布与数据校验记录。
bash
python manage.py showmigrations
python manage.py migrate --plan
python manage.py check --deploy专题二核对
- 静态文件名带内容哈希,并让旧制品至少存活到所有旧 HTML 缓存过期;回滚时继续提供旧哈希资源。
- 数据库失败让 readiness 返回非 2xx,使代理停止分流;liveness 仍反映进程是否活着,避免依赖故障制造重启风暴。
- 发布证据至少记录制品摘要、迁移计划、配置版本、探针结果、业务冒烟、指标窗口、决策人和回滚时间点。
深水边界
真正不可逆的数据变换需要备份、前进修复或业务补偿。迁移文件中的 reverse 函数存在,也不代表业务数据能无损回到旧语义。
开放练习(不提供答案)
在干净环境从备份恢复数据库,部署旧版本和新版本分别执行只读校验;记录恢复时间、缺失数据窗口和人工步骤。
加码题解:部署、探针与升级证据
python
def probe_status(*, database_ok, cache_ok):
return {
'live': True,
'ready': database_ok and cache_ok,
'dependencies': {'database': database_ok, 'cache': cache_ok},
}关键推理
liveness 与 readiness 分开,依赖故障时摘流而不是盲目重启。
可替代方案
部署平台可把探针、迁移计划、版本 SHA 和 smoke test 绑定成一次发布证据。
典型错误
先切流量再迁移,或启用 HSTS 后没有回滚与域名迁移预案。
复盘时请把状态码/事务/权限/资源清理中的至少一项写成自动化测试,而不是只截图成功页面。