Tag

#测试

包含这个标签的文章。

开发 197 阅读

Python 调用遗留命令乱码又卡死:字节解码、超时与安全参数实践

适用场景 本文适用于 Python 3.11 及以上版本。业务程序需要调用数据库备份工具、硬件厂商 CLI、Windows 遗留程序或内部运维命令,但这些程序的输出编码不是 UTF-8,并且可能出现长时间无响应、非零退出、输出管道堵塞或参数注入风险。 目标不是再封装一层 subprocess.run(),而是建立一个可

阅读全文
Python 223 阅读

HTTPX 流式响应偶发 PoolTimeout:从连接未释放到生命周期闭环

Python 服务用 HTTPX 转发大文件、对象存储下载或上游 SSE 时,通常会启用流式响应,避免把整个响应体读入内存。上线后却可能出现一种很迷惑的故障:服务启动时一切正常,运行一段时间后请求开始批量报 httpx.PoolTimeout;重启进程能暂时恢复,单纯调大连接池只能延后复发。 这类问题往往不是上游连接慢

阅读全文
开发 261 阅读

Go OAuth 令牌过期瞬间请求雪崩:用 singleflight 合并刷新并隔离超时

调用第三方 API 的 Go 服务通常会在内存中缓存 OAuth 访问令牌,并在令牌即将过期时刷新。单实例、低并发时,这段逻辑看起来很简单;并发升高后,几十个请求可能同时发现令牌失效,又同时访问认证端点。结果不是更快拿到新令牌,而是认证服务返回 429 Too Many Requests,业务请求批量失败,甚至出现“较

阅读全文
监控 249 阅读

Prometheus 告警反复触发与恢复:从指标断点到稳定窗口的治理实践

适用场景 这篇文章适合已经使用 Prometheus 和 Alertmanager,但值班群里经常出现同一告警在几分钟内“触发—恢复—再次触发”的团队。典型场景包括: 接口错误率在阈值附近上下波动; 抓取偶发失败,表达式短暂返回空向量; 应用滚动发布后计数器重置,瞬时比率失真; 规则计算过慢或远端数据到达较晚,评估结果

阅读全文
安全 266 阅读

Webhook 签名校验通过仍被重复执行:时间窗、幂等键与防重放实践

适用场景 支付回调、代码仓库事件、消息推送和第三方审批通知通常通过 Webhook 进入业务系统。很多服务已经实现了 HMAC 签名校验,却仍会遇到重复发货、重复记账或重复触发流水线的问题。 这类故障的关键在于:签名只能证明请求内容来自持有密钥的一方,不能证明这次请求从未被处理过。 一个合法请求被代理层、第三方平台或攻

阅读全文
Python 306 阅读

Python asyncio 优雅停机卡住:从取消信号被吞到结构化并发治理

适用场景与现象 异步消费者、WebSocket 网关或定时任务服务收到 SIGTERM 后,健康检查已经失败,进程却迟迟不退出,最终被 Kubernetes 在宽限期结束时强制 SIGKILL。常见伴随现象是: 停机日志只出现“开始关闭”,没有“后台任务已结束”; 某个任务仍处于 PENDING,但业务请求已经停止进入

阅读全文
数据库 359 阅读

MySQL 连接池复用后请求行为漂移:会话状态泄漏的排查与复位实践

适用场景与现象 同一个接口在生产环境中偶发出现以下现象:有时写入没有立即提交,有时日期相差 8 小时,有时普通查询突然以更严格的事务隔离级别执行。重启应用后故障暂时消失,单独连接 MySQL 手工执行又无法复现。 这类问题常见于使用连接池的 Web 服务、异步任务和批处理程序。连接池归还的是可复用的物理连接,而 MyS

阅读全文
开发 395 阅读

Go 配置热更新偶发数据竞争:用不可变快照与 atomic.Pointer 安全切换

配置热更新看起来只是“重新读一次文件”,但在高并发服务里,它实际上是一次共享状态切换。如果更新协程直接修改正在被请求协程读取的 map、切片或结构体字段,轻则读到新旧配置拼接出的混合状态,重则触发 concurrent map read and map write,让整个进程退出。 本文以一个会动态调整上游地址和超时时

阅读全文
开发 455 阅读

TypeScript 请求已超时却仍占用连接:用 AbortController 建立可取消的重试边界

适用场景 本文适用于 Node.js 20.3 及以上版本使用原生 fetch 调用内部 API、第三方服务或网关的 TypeScript 项目。示例使用该版本提供的 AbortSignal.any();更早版本可以用等价的信号组合函数替代。典型现象是:业务层已经返回“请求超时”,但下游仍持续收到请求;并发升高后连接数

阅读全文
Python 445 阅读

Python 异步服务日志串号:用 ContextVar 隔离 request_id 与后台任务上下文

适用场景 FastAPI、Django ASGI 或自研 asyncio 服务会在同一线程交错处理多个请求。团队希望所有日志自动带上 request_id,却发现并发压测时标识偶尔串到另一个请求,或请求结束后启动的后台任务仍携带旧用户上下文。 本文用 Python 标准库复现并修复这个问题。重点不是某个 Web 框架的

阅读全文