应使用连接池优化数据库性能并异步处理耗时操作。需调优SetMaxOpenConns、SetMaxIdleConns和SetConnMaxLifetime;HTTP handler中仅校验与入队,耗时任务通过channel+goroutine或消息队列异步执行。
数据库连接创建和销毁是高频API的性能瓶颈。Golang标准库的database/sql本身支持连接池,但默认配置偏保守。需显式调优:
MaxOpenConns一致,减少新建连接频率示例初始化:
db, _ := sql.Open("postgres", dsn)HTTP handler必须快进快出。文件上传、发邮件、写日志到远程服务、复杂计算等,都不该阻塞响应。用channel+goroutine或轻量消息队列解耦:
type ProcessOrderTask struct{ OrderID string; UserID int })taskCh ,立即返回202 Accepted
for task := range taskCh { process(task) }
注意:channel需带缓冲(如make(chan Task, 1000)),避免突发流量压垮内存;若需持久化和重试,可换用Redis Stream或NATS。
若API需频繁调用其他内部服务(如认证中心、用户服务),默认http.DefaultClient会为每次请求新建TCP连接。应自定义client并启用连接复用:
Transport.MaxIdleConns和MaxIdleConnsPerHost(如都设为100)IdleConnTimeout(如30秒),及时释放空闲连接ExpectContinueTimeout(设为0),避免小请求多一次RTT常见陷阱包括:同步读大文件、用time.Sl模拟延迟、调用未设超时的第三方API、序列化超大JSON。这些都会卡住goroutine调度器:
eep
io.Copy流式处理,或异步预加载到内存缓存context.WithTimeout,超时时间≤你API的SLA(如整体响应要求≤200ms,则下游调用设≤150ms)json.Encoder直接写入http.ResponseWriter,避免json.Marshal生成大byte切片基本上就这些。吞吐量优化不是堆硬件,而是让每个goroutine尽可能少等、少分配、少切换。