实现一个带重试与退避的 HTTP 客户端
调用第三方接口,网络抖一下很正常。但"失败就重试"如果写得随意,反而会把对方打挂、把自己的线程占满。一个可靠的重试客户端要同时满足:会退让、有边界、可取消。 最容易踩的坑 for i := 0; i < 3; i++ { resp,
调用第三方接口,网络抖一下很正常。但"失败就重试"如果写得随意,反而会把对方打挂、把自己的线程占满。一个可靠的重试客户端要同时满足:会退让、有边界、可取消。 最容易踩的坑 for i := 0; i < 3; i++ { resp,
限流是后端最常用的自我保护手段。固定窗口实现简单但有临界突刺,滑动窗口更平滑但开销大。折中方案是令牌桶:既允许合理突发,又能扛住持续高压。 为什么不用固定窗口 固定窗口(每秒计数)的问题在边界:第 0.9 秒来 100 个请求,第 1.1
Go 1.18 引入泛型后,最实用的场景之一就是把"返回值 + 错误码"这种固定结构的接口统一起来。本文用一个小例子讲清楚约束怎么写、什么时候该用。 问题:重复的返回结构 每个业务接口都要返回"数据 + 状态码 + 消息",手写三遍很烦:
asyncio 里"超时"和"取消"是一件事的两面:超时本质上是到点发取消信号。但很多代码只包了 wait_for 就以为万事大吉,真正的问题往往出在被取消的任务不肯干净退出。 最基础的写法 async def fetch(session,
sql.DB 本身就是一个连接池,但默认参数是为"单机演示"设计的。线上服务不调这三个参数,高并发下大概率会出现"连接打满、请求排队、P99 飙升"。 三个关键参数 SetMaxOpenConns(n):允许同时打开的最大连接数,防止把数据