-
我的 HTTP 请求明明已经超时返回了,可它在后台启动的 goroutine 还在埋头跑、下游调用也没停,goroutine 越积越多内存一路涨,因为我没把 context 的取消信号传下去也没人监听它的深度复盘
我有个接口处理请求时会启动一些 goroutine 做并行子任务,并给请求设了超时。线上现象诡异:有些请求超时返回了,可监控显示 goroutine 数量只增不减、内存一路缓慢上涨。排查发现那些超时的请求主流程返回了,但它启动的 goroutine 还在后台埋头跑(还在查早已没人要结果的下游)、跑完没人收、白白耗着然后泄漏。复盘才搞懂:Go 用 context 传播取消/超时,请求超时时 ctx …- 5
- 0
-
我用 WaitGroup 等一批 goroutine 全部干完,却把 wg.Add 写进了 goroutine 内部,结果主协程的 Wait 在 Add 之前就跑完直接返回,程序以为活儿都干完了其实大半还没开始:一次 WaitGroup 时序用错的深度复盘
我要启动一批 goroutine 并发处理任务、再用 WaitGroup 等它们全部干完汇总结果,写成了在循环里 go func(){ wg.Add(1); defer wg.Done(); doWork() }()——把 wg.Add(1) 放在了 goroutine 内部。线上现象诡异:不报错,但汇总结果经常不完整,明明启动 100 个任务却只有零星几个的结果。复盘才搞懂:WaitGroup …- 0
- 0
-
Go 错误处理工程化:%w 包装、errors.Is 与 errors.As 实战
线上一个 Go 服务报警,日志里只有冷冰冰一行 unexpected EOF,没栈、没请求 ID、没下游——顺着代码扒,发现 error 从最底层被裸 return err 透传了七八层,没有一层添过一个字。那次之后我把错误当成 API 的一部分来设计:用 %w 给每层留线索、哨兵错误配 errors.Is 让调用方认得出身份、自定义类型配 errors.As 让错误带上数据,再到 panic 的…- 0
- 0
-
从粗放 Go 微服务裸 go 无限开 goroutine 泄漏暴涨几十万 OOM + 无 context 传递被慢下游拖垮全链路无限干等堆积雪崩 + err 被 _ 丢掉漏接出错不知哪层报的 + 滥用 panic 当错误处理没 recover 一个边角崩整个进程 + 共享变量裸读写 data race 偶发脏数据和 concurrent map writes 崩溃 + interface{} 加类型断言丢类型安全运行时动不动 panic + 手撸 WaitGroup 加 error channel 协调并发又长又易错死锁漏收 + 热点频繁分配小对象 GC 压力大 STW 停顿肉眼可见 + 线上黑盒哪慢哪漏全靠猜 + 部署直接 kill 硬断在途请求连接 → 2026 现代高并发 Go 工程 worker pool 受控并发加 context 退出 + context 全链路传递超时取消 + 显式 error 加 %w wrapping 加 errors.Is/As + Mutex/atomic/channel 保护加 -race 检测 + 泛型 type-safe 编译期保证 + errgroup 统一并发错误取消 + sync.Pool 复用减少逃逸 + pprof/trace/metrics 可观测 + signal 加 context 优雅关闭 drain 排空 87 天战役复盘:47 套工程修法 + 7 个 P0 复盘 + 6 条工程哲学
10 人的 Go 基础设施与后端团队 87 天把一套用了四年、流量从每秒几千涨到每秒几十万后种种粗放并发写法集中爆雷的 Go 微服务集群——到处是裸 go 启动 goroutine 不加任何数量限制也没有退出机制高峰期 goroutine 暴涨到几十万 OOM、很多 goroutine 因为在阻塞 channel 上永远等不到信号而悄无声息泄漏越积越多、请求链路上完全没有 context 传递一个…- 4
- 0
-
从 Go 1.x GOPATH 时代 + dep/手工 vendor 依赖对不上 + 无泛型到处 interface{} 断言 + 裸 errors.New 拼字符串无上下文 + 不传 context 协程无法取消超时 + 满世界 sync.Mutex 加锁易死锁 + 手撸 goroutine 不管生命周期到处泄漏 + 标准 log 无结构 古老 Go 体系 → 2026 Go 1.22 + Go Modules 可复现依赖 + 泛型类型安全 + errors.Is/As 错误包装错误链 + context 全链路传递取消超时 + channel/errgroup 并发编排 + slog 结构化日志 + 泛型容器函数式工具 现代 Go 体系 87 天战役复盘:47 套工程修法 + 7 个 P0 复盘 + 6 条工程哲学
13 位 Go 后端工程师 87 天把一套跑了六年的古老 Go 体系——GOPATH 目录束缚、dep 和手工 vendor 管依赖经常对不上、完全没有泛型到处 interface{} 加类型断言、裸 errors.New 拼字符串没堆栈没上下文、不传 context 协程无法取消无法超时、满世界 sync.Mutex 共享内存加锁还经常死锁、手撸 goroutine 不管生命周期到处泄漏、标准 …- 6
- 0
-
从 Go 1.11 + GOPATH + dep + 无泛型 + interface{} + 裸 goroutine + log 纯文本 远古集群 → Go 1.24 + Modules/Workspaces + 泛型 + errgroup/context + net/http 1.22 + log/slog + PGO + fuzzing 现代工程体系 67 天踩坑录:版本阶梯 + 38 套修法 + 7 个 P0 复盘 + 6 条工程哲学
19 位 Go 后端工程师 67 天用版本阶梯 + 灰度替换策略把一套跑了六年、累计 38 万行的 Go 1.11 + GOPATH + dep + 无泛型 + 裸 goroutine 远古集群,平滑迁移到 2026 年 Go 1.24 + Modules/Workspaces + 泛型 + errgroup/context + net/http 1.22 增强路由 + log/slog + PG…- 0
- 0
errgroup
幸运之星正在降临...
点击领取今天的签到奖励!
恭喜!您今天获得了{{mission.data.mission.credit}}积分
我的优惠劵
-
¥优惠劵使用时效:无法使用使用时效:
之前
使用时效:永久有效优惠劵ID:×
没有优惠劵可用!






