发一次版就冒一串 502,别急着怪 K8s 探针,先看你的关闭顺序
graceful shutdown 不是加个 signal.Notify 加个 server.Shutdown() 就完事。它是一整套关闭顺序:先停接新请求,再等存量请求做完,最后才关 DB、MQ、连接池。顺序反了,收到信号就关依赖,等于让还在飞的请求集体撞墙。
包含 68 篇文章的标签合集
graceful shutdown 不是加个 signal.Notify 加个 server.Shutdown() 就完事。它是一整套关闭顺序:先停接新请求,再等存量请求做完,最后才关 DB、MQ、连接池。顺序反了,收到信号就关依赖,等于让还在飞的请求集体撞墙。
官方 10–40% 说的是 GC 自身的 CPU 消耗。先量 GC 占总 CPU 的比例,再决定正常升级、做 A/B,还是临时关闭 Green Tea。
sync.Map 不是无锁 map。read/dirty 双 map 只是让某些读绕过锁,但 Load/Store/Delete 路径各有锁前锁后判断。看不懂这些边界,就别怪线上用了 sync.Map 反而更慢。
覆盖率80%不敢重构,问题出在哪。四个模式 + 一个判断框架。
Go 数据库连接池不是越大越稳。max_open 管并发上限,max_idle 管建连频率,idle_time 管空闲回收,lifetime 管连接寿命。真正要做的是先看 DB.Stats 和数据库侧指标,再决定该调哪一个阀门。
sync.Map 不是普通 map 的并发升级版。它只在 key 稳定、读命中稳定、写入模式合适时才像优化;一旦牵涉业务不变量、Range 快照、hot key 覆盖和类型安全,map+锁往往更清楚。
Mutex、RWMutex、sync.Pool 不是性能优化按钮。它们背后真正做的是吞吐、尾延迟、公平性和 GC 压力之间的取舍。看懂这三笔账,线上 p99 抖动时才不会把优化写成新问题。
Go 项目的可维护性,不看目录有多像架构图,而看新人能不能在 30 秒内找到修改点、一个 grep 定位业务逻辑。少分层不是偷懒,不承担变化的分层才是架构税。
一篇真实的迁移记录:什么场景下宁可多花两周也要换,什么场景保留 MySQL 不动。连接风暴、DDL 阻塞、autovacuum 陷阱、混合架构——都是付过学费才得到的判断。
实时推送选型没有银弹。这篇文章不讲协议细节,从工程体感、翻车经验到决策框架,帮你判断什么时候选 WebSocket,什么时候用 SSE,什么时候该上 gRPC Stream。
GraphAgent 检查点机制、Human-in-the-Loop、Skills 可复用工作流、A2A/MCP 协议集成、可观测性与评测——tRPC-Agent-Go 的生产级特性全面解析。
腾讯 tRPC 团队出品的 Go 语言 Agent 框架全面分析——5 分钟上手、五种 Agent 类型、GraphAgent 对标 LangGraph、与 Python 框架怎么选。
公开招聘样本里,Go + AI Agent 的 30K-60K 不是纯编的。但真正值钱的不是会调模型 API,而是把 Agent 做成可上线、可评测、可观测、可控成本的后端系统。
Go 在 AI Agent 生态里真正补齐的不是模型能力,而是编排层、协议层和运行时层。Eino、MCP Go SDK、Genkit Go、langchaingo、GoClaw 都在不同层面解决问题,但这不等于 Go 可以全面替代 Python。
这两版 Go 最值得看的地方,不是又多了几个语法点,而是运行时、go fix、synctest 和 gopls MCP 正在把团队长期积下来的性能债、写法债、测试债慢慢搬进工具链里。
nil 不是一个统一的空值。nil 指针、nil interface、nil slice、nil map、nil channel 在 Go 里走的是几套完全不同的规则。真正难的不是记住 nil 会不会 panic,而是看懂它现在挂在哪个类型下面。
OpenAI-compatible 不是换个 base_url 就完事。真正决定请求、响应和流式解析的,是 endpoint path 背后的协议契约。
Claude Code 跟 Cursor 最大的差别,不是模型,也不是谁更会写代码,而是它逼你把一次编码任务变成可计划、可执行、可验证的闭环。
一个没有函数调用的 for 死循环,为什么没有把 Go 程序和 GC 一起拖死?从同步抢占、asyncPreempt、safe point、sysmon retake 到 GC worker,这篇把 Go 调度器的第三个关键问题讲清楚:正在跑的 goroutine,runtime 到底怎么把它停下来。
阻塞 syscall 为什么不会拖死整个 Go 程序?net.Conn.Read 为什么不是让一条线程傻等?看懂 syscall handoff、netpoller 和 work stealing,关键是把等待、线程和 P 这张执行许可证拆开。
channel 导致的 goroutine 泄漏通常分两种方向:sender 发了没人接,或者 receiver 等了没人发。排查时要走出三条线才能锁定代码里的真实责任方。
goroutine 涨了就加 buffer,是把问题从第 101 次发送推迟到第 1001 次。真正的根因是 nil channel、closed panic、sender/receiver 不匹配——这些加 buffer 都解决不了。
channel 不只是队列,Mutex 不只是锁。每个同步原语都在建立 happens-before 关系:send 和 receive 之间有、Unlock 和 Lock 之间有、Once.Do 返回和后续调用之间有。没有这些链,可见性就不存在。
普通变量的先写后读不提供跨 goroutine 的可见性。Go 内存模型的要求很硬核:写入和读取之间必须有 happens-before 证明链,否则代码跑得再好也只是碰巧。
Go 服务内存持续涨,不一定是 GC 的锅。goroutine 泄漏修生命周期,无界缓存修淘汰策略,高分配速率修代码本身——三类问题,三类修法,只有一个共同点:都不该先调 GOGC。
OOMKilled 了别急着调参数。先去 kubectl describe 确认事故现场,再抓两次 heap profile 用 diff_base 看谁在涨,最后才决定动 GOGC 还是 GOMEMLIMIT。
线上 GC 调优最怕先有答案再找证据。正确的顺序是:先确认 GC 是不是问题→看 live heap→看分配速率→再决定参数→最后设回滚线。没有基线的调优,只是玄学。
GOGC 调高后 GC 变少了、CPU 好看了,但堆峰值也高了。GOMEMLIMIT 不是另一个版本的 GOGC,它约束的是 Go runtime 管理的内存边界,不是整个 RSS。
pprof 只告诉你在哪,不告诉你为什么。按创建路径、取消路径、响应路径三条线,把每个阻塞 goroutine 的生命周期拆清楚——是谁创建的、谁来取消、有没有响应 Done。
goroutine 涨了,别直接怀疑 context 泄漏。先用 NumGoroutine 确认趋势,再用 pprof 把数量变成栈,最后用 go vet 抓住静态路径上的低级错误——这个顺序不能反。
Context 能被取消,却没有自己的 Cancel 方法——这是故意的。WithCancel 返回两个东西:观察用的 Context 和控制用的 CancelFunc。子操作不能取消父操作,调用链才不会乱。
Go 的 context 看起来啰嗦,尤其是 handler、service、repo 层层传 ctx。真正的取舍不是语法优雅,而是把调用链生命周期放到签名里,让超时、取消和资源边界变得可查。
很多人盯着 STW 的微秒级停顿不放,却忽略了并发标记才是 GC 真正吃掉 CPU 的地方。三色标记解决的不是颜色问题,是并发安全;写屏障也不是玄学,是防止漏标的保险。
2026-05-27 前后,openai-codex / gpt-5.5 用户集中遇到 `TypeError: 'NoneType' object is not iterable`、fallback 和卡死。问题大概率不在你的配置,而在 Codex backend 与 openai-python Responses stream 解析之间的兼容坑。
select 不是一次随机的 O(1) 选择。每个 select 背后,runtime 要剔除 nil channel、随机化 poll order、按地址排序 lock order、逐个检查、注册、等待、清理。case 越多,runtime 的活越重。
close(ch) 不只是关门。源码里它会遍历 recvq 和 sendq,按队列逐个唤醒所有阻塞的 goroutine。区别是:receiver 得到零值,sender 等到的是 panic。
ch <- v 在 Go runtime 里不是发往一个队列就完事了。chansend 有五条路径:先看有没有 receiver,再看 buffer 有没有空位,最后才决定是挂起还是直接失败。每一条路径背后都藏着一个取舍。
很多 Go 代码把 context.WithValue 当成万能参数袋,函数签名看起来干净,依赖却被藏进调用链。从 valueCtx、propagateCancel、Background 和 TODO 的源码边界出发,给出一份可以直接拿去做 code review 的 context 检查清单。
很多 Go 代码写了 context.WithTimeout,却仍然出现 goroutine 上涨和资源保留。问题不在 timeout 没生效,而在 cancel 的职责、Done 的响应和排查路径被混在了一起。
线上接口超时后 goroutine 数还在上涨,很多人第一反应是 context 没生效。真正的问题往往不是 timeout 没到,而是业务 goroutine 没有响应取消信号。
Go channel 写到真实工程里,最容易出问题的往往不是 send 和 receive,而是 close、select、buffer 和生命周期。close 是发送端协议,buffer 不是取消机制,channel 一旦出现,就要设计谁创建、谁发送、谁关闭、谁退出。
Go 并发代码里,channel 和 mutex 不是谁更高级的问题。mutex 保护一块状态,channel 描述一段关系。下次纠结工具前,先用这五个问题判断问题形状。
Go channel 的价值不是替代 mutex,也不是把锁藏起来,而是把 goroutine 之间的通信关系写清楚。一个简单 cache 被 channel 化,往往不是更 Go,而是把一把锁绕成了一套协议。
很多 Go map 文章还在讲 hmap、bmap、overflow bucket 和 load factor 6.5。但从 Go 1.24 开始,默认 map 实现已经换成 Swiss Table。API 没变,底层发动机变了。
很多人能背出 G 是 goroutine、M 是线程、P 是 processor,却讲不清 P 为什么存在。理解 Go 调度器,关键不是记住三个字母,而是看懂 runtime 为什么要把任务、线程和执行资源拆开。
Go 数组不是 slice 的过时底层细节。它把长度、值语义、比较能力和固定布局都写进类型里,牺牲弹性,换来边界清楚和编译器可证明的信息。
很多人把 slice 理解成动态数组,却忽略了 Go 真正的设计取舍:数组给机器确定性,slice 给程序员弹性,而大多数坑都藏在这两者之间。
从一个看似无害的 ready 标志位开始,讲清 Go happens-before、DRF-SC、race detector、sync/atomic 和内存屏障的边界:并发安全不是看起来有顺序,而是规范承认它有顺序。
从一次 Kubernetes 里的 OOMKilled 讲起,整理 Go GC 线上排查顺序:heap profile、diff_base、MemStats、RSS、GOMEMLIMIT、K8s limit 与监控告警。
从 p99 周期性抖动和 GC CPU 5% 的真实场景出发,讲清 GOGC、GOMEMLIMIT、STW、gctrace 和容器环境下的 Go GC 调优顺序。
从一个线上内存持续增长的场景讲起,拆解 Go GC 的三色标记、写屏障、STW、GOGC 与 GOMEMLIMIT,给出一套能落地的排查和调优顺序。
goroutine 涨了,channel 卡了,第一反应加 buffer?这篇从 pprof 采样到三条线分析法,把 Go channel 六大常见陷阱、排查路径和修复模式一次讲透。
从 goroutine 数上涨开始,按采样、pprof 定位、go vet 静态检查、创建/取消/响应三条线分析、修复验证的顺序,给出一套排查 Go context 相关泄漏的最小实操流程。
从 Java ThreadLocal、Node.js AsyncLocalStorage、Python contextvars 的隐式上下文说起,拆解 Go context 坚持首参传递背后的代价、收益和工程取舍。
从一次接口超时和 goroutine 上涨的排查开始,拆解 Go context 的 cancelCtx、timerCtx、valueCtx:cancel 到底做了什么,WithTimeout 为什么要 defer cancel,pprof 和 go vet 怎么定位问题。
用一个最小登录页 demo,演示 Cursor Agent 的正确使用顺序:先分析、再计划、再执行、最后验收。附可复制提示词和自检模板。
Cursor 的门槛不在按钮和快捷键,而在上下文、计划、验收和回滚。用一个最小登录页实测,讲清楚怎样把 Agent 放进可控开发流程。
一篇从命令到流水线的 Hermes Kanban 硬核使用指南:任务创建、依赖链、dispatcher、review-required、Dashboard、worker_context 和技能整合。
花两份钱买两个 AI 编程工具,最后两边都浪费。问题不在工具,在你没想清楚自己的入口在哪。
Claude Code 的进阶用法不是把权限开大,而是建立一套可中断、可回滚、可验证的工作流。
从安装到第一个项目,Plan Mode + claude.md 才是 Claude Code 的灵魂。不是功能越多越好用,而是用对方法才不翻车。
能单 Agent 解决的,别拆成三个。但如果你真的需要多 Agent,这篇能帮你选对框架、跑通示例、避开常见坑。
很多开发者天天在用 PostgreSQL,但理解还停在会写 CRUD、知道 ACID、知道 JSONB 很灵活。真正拉开差距的,不是 SQL 熟不熟,而是你有没有把 TOAST、MVCC、WAL、Checkpoint 这四套机制放进同一张系统图里看明白。
同样的 AI 工具,有人用来聊天摸鱼,有人却能搭建自动化工程系统。差别不在于模型能力,而在于工作流。
PostgreSQL 的能力早已超越了传统关系型数据库的范围。从 JSON 支持到全文检索,从向量数据库到定时任务,从缓存表到 RESTful API——很多原本需要多个组件协作才能完成的功能,PostgreSQL 一个数据库就能搞定。
Redis 本身不难,难的是很多问题都不是命令问题,而是设计问题。大 Key、缓存穿透、雪崩、热 Key、持久化、淘汰策略和集群倾斜,这 7 个坑我按线上后果重新梳理了一遍。
别再等别人写教程了。Gemma 4 发布后,最稳的一条本地路线就是:hf 下载 GGUF,Ollama 导入,再接进 OpenClaw。本文把这条链路一步一步走通。
阿里最新发布 0.8B-9B 端侧模型,10 分钟完成部署,显存最低 500MB。本文实测 4 种型号在 OpenClaw 中的表现,含完整配置、性能数据、踩坑记录。