Kubernetes 滚动重启后仍有旧代码:可变镜像标签与 Digest 发布的定位和修复
适用场景 某个 Deployment 使用 registry.example.com/payments/api:stable 这类会被覆盖的标签。流水线已经把新镜像推送到仓库,也执行了 kubectl rollout restart deployment/payments-api,但灰度流量中仍偶发旧接口行为;更棘手的
技术笔记、项目复盘、阅读摘录和问题清单。
适用场景 某个 Deployment 使用 registry.example.com/payments/api:stable 这类会被覆盖的标签。流水线已经把新镜像推送到仓库,也执行了 kubectl rollout restart deployment/payments-api,但灰度流量中仍偶发旧接口行为;更棘手的
导入程序先写入批次记录,再调用公共函数写明细,最后校验失败抛出异常。代码外面明明套了 with connection,重查数据库却发现批次和明细都还在。遇到这种情况,先沿调用链检查谁执行了提交,尤其是公共函数里的第二层 with connection。 下面是可执行的缩小案例,不对应某个生产事故。适用于 Python
批量注册三个导出任务,执行日志却出现三次同一个任务编号;回调数量正确,也没有异常。这时先检查回调如何绑定参数,再检查调度器是否重复投递。 本文使用进程内的零参数回调作为场景:注册阶段只保存函数,执行阶段才调用。示例不连接数据库、不访问网络,也不冒充真实生产事故。 现象:注册时正确,执行时全部变了 保存下面代码为 lat
场景与现象 后台有一个商品标题搜索框,产品约定是“包含输入文字”。运营想找标题里带 50% 的商品,却同时搜到了 500g;输入 _ 后,大部分非空标题都出现在结果里。接口已经使用 SQL 参数绑定,代码审查也没有发现字符串拼接。 下面复现的是搜索语义错误:输入中的特殊字符进入了 LIKE 模式。本文以 Python
在项目目录运行脚本一切正常,交给定时任务后却报 FileNotFoundError。把配置文件再复制一份,错误消失了,程序却读到了旧配置。这两种现象往往来自同一个问题:程序把启动时的工作目录当成了配置文件所在目录。 本文用一个普通 Python 脚本演示取证、修复和回归测试。示例只读取本地文件,不依赖网络,不要求安装第
订单表有三条记录,导出任务正常结束,却只生成一条。没有 SQL 异常,也没有过滤条件变化。检查循环体后发现:遍历订单的游标,又被用来查询客户名称。 这类漏行先查游标的使用范围。增加超时或重试次数不会修复已经被替换的结果集。 适用场景与现象 本文针对 Python 标准库 sqlite3:外层逐条读取订单,内层查询关联信
适用场景与现象 一个批处理服务用 EXPORT_ENABLED 控制是否生成导出文件。发布配置里已经写了 false,应用重启后却仍进入导出分支。开发环境不设置该变量时,功能又能正常关闭。 下面用这个场景复现问题。它适用于直接读取环境变量的 Python 程序;如果项目使用配置框架,应先查明框架自己的布尔解析规则,避免
接口返回成功,主表记录也还在,但关联明细突然清空。遇到这种现象,先找到实际执行的 SQL:如果所谓“更新”用了 INSERT OR REPLACE,就要沿着删除路径排查。 本文用一个订单与明细模型复现问题,再把写入改成有明确冲突目标的 UPSERT。实验只使用内存数据库,不连接生产服务。 适用场景与现象 适用于 SQL
适用场景与异常表现 离线任务跑了 26 小时,报表却显示只耗时 2 小时;开始、结束时间颠倒了 1 秒,监控却出现接近 24 小时的长任务;耗时 250 毫秒的接口被统计为 0 秒。这三种现象可能来自同一行代码: duration_seconds = (finished_at - started_at).seconds
适用场景:地址跳转成功,业务请求却变了 接口从 /orders 迁移到 /orders/,或者网关增加域名规范化规则后,调用方开始收到 405、参数缺失,甚至收到 200 的 HTML 页面。调用日志只保留最终响应,看起来像后端突然不认识请求体。 这类问题先查重定向链:客户端发出的第一跳是 POST,不代表最终到达业务