Golang 超时控制

By kcersing , 17 四月, 2026

遇到超时,尤其是整合数据,RPC获取用户,获取产品,获取销售人员,获取有没有符合的优惠价最低折扣等,遇到一个慢查询或者服务崩溃避免整个链路崩溃,就要控制崩溃的边界。

在写golang时,请求进来,一般要求全链路,单链路最常用的控制超时就是设置WithTimeout超时时间或者select  case <-time.After()。

如果并发任务 多少使用goroutine :

 ctx, cancel := context.WithTimeout(context.Background(), 1200*time.Millisecond)
 defer cancel()

 g, ctx := errgroup.WithContext(ctx)

 g.Go(func() error {
  select {
  case <-time.After(300 * time.Millisecond):
   //Finish your business logic.
   return nil
  case <-ctx.Done():
   return ctx.Err()
  }
 })

 g.Go(func() error {
  select {
  case <-time.After(300 * time.Millisecond):
   //Finish your business logic.
   return nil
  case <-ctx.Done():
   return ctx.Err()
  }
 })

 if err := g.Wait(); err != nil {
  fmt.Println("失败:", err)
  return
 }

像经常使用的kitex,也可以在服务端设置超时:

import "github.com/cloudwego/kitex/server"

svr := yourservice.NewServer(handler,
    server.WithReadWriteTimeout(5 * time.Second),
)
//备注 :
// WithReadWriteTimeout sets the read/write timeout on network.
// IMPORTANT: this option is not stable, and will be changed or removed in the future!!!
// We don't promise compatibility for this option in future ver

或者

import "github.com/cloudwego/kitex/server"

svr := yourservice.NewServer(handler,
    server.WithExitWaitTime(5 * time.Second),
)

 

 

 

 

 

 

 

标签