遇到超时,尤其是整合数据,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),
)