说明:
说明:
kerrors.ErrRPCTimeout
;在初始化 client 时传入:
import "github.com/cloudwego/kitex/client"
cli, err := xxx.NewClient(targetService,
client.WithConnectTimeout(100 * time.Millisecond),
client.WithRPCTimeout(2 * time.Second))
注:两个配置项可以按需独立配置。
发起请求时传入:
import "github.com/cloudwego/kitex/client/callopt"
rsp, err := cli.YourMethod(ctx, req,
callopt.WithConnectTimeout(100 * time.Millisecond))
callopt.WithRPCTimeout(2 * time.Second))
注:两个配置项可以按需独立配置。
适用于需要动态配置的场景,每次请求前,Client 会调用 `TimeoutProvider 获取 RPCTimeout 和 ConnectionTimeout。
在初始化 client 时传入用户自定义的 rpcinfo.TimeoutProvider
:
import (
"github.com/cloudwego/kitex/client"
"github.com/cloudwego/kitex/pkg/rpcinfo"
)
type UserTimeoutProvider struct {}
func (UserTimeoutProvider) Timeouts(ri rpcinfo.RPCInfo) rpcinfo.Timeouts {
// 需返回 RPCTimeout、ConnectTimeout
// ReadWriteTimeout 实际未被使用,建议返回值与 RPCTimeout 相同
}
opt := client.WithTimeoutProvider(&UserTimeoutProvider{})
cli, err := xxx.NewClient(targetService, opt)
可用的配置中心扩展:
在请求超时的情况下,Client 收到的 Error 为:
&kerrors.DetailedError {
basic: kerrors.ErrRPCTimeout,
cause: errors.New("timeout=100ms, to=ServerName, method=MethodName, location=kitex.rpcTimeoutMW, remote=0.0.0.0:8888"),
}
可使用 kerrors.IsTimeoutError(err)
来判断是否是超时错误。
适用于 github.com/cloudwego/kitex >= v0.5.2
默认情况下,ErrRPCTimeout 可能有几种原因:
某些业务场景需要区分这些原因,例如同时发出多个请求,只要有一个请求成功,其他请求就会被 cancel,但这不是 RPC 或业务错误,希望区分这类结果,以免引起报警。
考虑到前向兼容,该配置默认关闭,需要在代码中主动设置:
import "github.com/cloudwego/kitex/pkg/rpctimeout"
rpctimeout.EnableGlobalNeedFineGrainedErrCode()
开启前后区别如下:
Scenarios | Disabled | Enabled |
---|---|---|
kitex 设置的超时到期 | kerrors.ErrRPCTimeout | kerrors.ErrRPCTimeout |
业务主动调用 ctx.Cancel() | (同上) | kerrors.ErrCanceledByBusiness |
业务代码设置的超时到期(比kitex配置更短的 timeout) | (同上) | kerrors.ErrTimeoutByBusiness (*注) |
*注:考虑到 go 的 timer 有误差,在超时发生时,会判断 actualDDL + 50ms < Kitex’s DDL,满足条件才会返回该错误码,否则仍返回 103。
例如 Kitex 设置 1s 超时:
该阈值 (50ms) 在 Kitex >= 0.7.1 可通过如下方式修改:
rpctimeout.SetBusinessTimeoutThreshold(10 * time.Millisecond)
说明:
举例:client 端数据分多次发送,如果发送间隔过长,会触发 server 端读等待超时;这时需考虑调大 ReadWriteTimeout。
说明:
github.com/cloudwego/kitex >= v0.9.0
(针对非 Streaming API)如果从请求的 TTHeader 中读到了 timeout,则写入 server 请求的 ctx 。
具体用法请参考后文示例代码。
说明:
ctx.Deadline()
会通过 grpc_timeout
header 发送给 server,写入 server 的 ctxWithRPCTimeout
option 指定 RPC 超时时间rpcinfo.GetRPCInfo(ctx).Config().RPCTimeout()
获得这个值在初始化 Server 时指定:
import "github.com/cloudwego/kitex/server"
svr := yourservice.NewServer(handler,
server.WithReadWriteTimeout(5 * time.Second),
)
在初始化 Server 时指定:
import "github.com/cloudwego/kitex/server"
svr := yourservice.NewServer(handler,
server.WithExitWaitTime(5 * time.Second),
)
该 Option 需配合 TTHeader 使用,详见下方示例代码。
Client
cli := yourservice.MustNewClient(
serverName,
client.WithTransportProtocol(transport.TTHeader),
client.WithMetaHandler(transmeta.ClientTTHeaderHandler),
client.WithRPCTimeout(time.Second),
)
Server
svr := yourservice.NewServer(handler,
server.WithMetaHandler(transmeta.ServerTTHeaderHandler),
server.WithEnableContextTimeout(true),
)
这是服务端解码时等待包的超时时间,与服务端 handler 的执行没有关系(服务端handler执行时,已经完成解码)
目前服务端不支持 handler 执行超时,只支持读写超时。