当流量瞬时激增时,API会出现大量 HttpCode 为 503 的错误。与此同时,发现另一个错误 `responses.go:69 write response failed, error: context canceled` 与该错误具有很强的相关性。这 2 个错误都由我们使用的 go-zero 框架内部抛出。后来我花费了16个小时来搞清楚这个事情,在这里分享给大家。/01 结论先行...
go-zero timeHandler中间件中实现的Write func(tw*timeoutWriter)Write(p[]byte)(int,error){tw.mu.Lock()defertw.mu.Unlock()iftw.timedOut{return0,http.ErrHandlerTimeout}if!tw.wroteHeader{tw.writeHeaderLocked(http.StatusOK)}returntw.wbuf.Write(p)} 为什么要在中间件自定义Buffer缓冲用户应用层所有的...
func (l*{{.logicName}}) {{.method}} ({{if.hasReq}}in{{.request}}{{if.stream}},stream{{.streamBody}}{{end}}{{else}}stream{{.streamBody}}{{end}}) ({{if.hasReply}}{{.response}},{{end}} error) {// todo: add your logic here and delete this linereturn{{if.hasReply}}&...
10. func (l *CmdSetLogic) CmdSet(in *status.CmdSetReq) (*status.CmdSetResp, error) { // todo: add your logic here and delete this line err := l.svcCtx.Cache.SetWithExpire(shared.CacheSnPrefix+in.Sn, in.Cmd, 60*time.Duration(in.Expire)*time.Second) if err != nil && err =...
(s *Server) Start() -> (ng *engine) start(router httpx.Router) error 调用内部服务启动,注册...
Context) error { mresp, err := c.MemberList(ctx) if err != nil { return err } var eps []string for _, m := range mresp.Members { ... } c.SetEndpoints(eps...) return nil } 上面这个方法报错,因为 Auto sync endpoints failed 是一直出现的,说明 go-zero 里面有个地方,应该也配置...
)iferr := mr.Finish(func()error{varerrerrorifp, err = l.svcCtx.ProductRPC.Product(l.ctx, &product.ProductItemRequest{ProductId: req.ProductID}); err !=nil{returnerr }returnnil},func()error{varerrerrorifcs, err = l.svcCtx.ReplyRPC.Comments(l.ctx, &reply.CommentsRequest{TargetId: re...
t.Errorf("oid len expected 24, got: %d", len(oid)) } } 在当前路径下执行go test命令,可以看到输出结果如下: PASS ok github.com/zhoushuguang/lebron/apps/order/rpc/internal/logic 1.395s 还可以加上-v输出更完整的结果,go test -v输出结果如下: ...
下面我们一起来分析分类商品列表的逻辑该怎么写,首先先从缓存中读取当前页的商品id索引,调用cacheProductList方法,注意,这里调用查询缓存方法忽略了error,为什么要忽略这个error呢,因为我们期望的是尽最大可能的给用户返回数据,也就是redis挂掉了的话那我们就会从数据库查询数据返回给用户,而不会因为redis挂掉而返回错误。
logx.Errorf("HitQuota key: %v", key) // todo: maybe we need to let users know they hit the quota return false default: logx.Errorf("DefaultQuota key: %v", key) // unknown response, we just let the sms go return true }