Kitex超时

2024-01-17T14:21:02+08:00 | 1分钟阅读 | 更新于 2024-01-17T14:21:02+08:00

@

客户端

1、客户端统一超时控制

这个所有的本次连接都是一样的时间,但是有些服务就是快有些就是慢,这个控制很不精准

client, err := math.NewClient(
    "dqq.math",
    client.WithResolver(resolver),
    // client.WithHostPorts("127.0.0.1:5678"),
    client.WithMiddleware(TimerMW),
    client.WithConnectTimeout(100*time.Millisecond),  // 连接超时
    client.WithRPCTimeout(200*time.Millisecond),   // RPC超时
)
if err != nil {
    klog.Fatalf("create rpc client fail: %s", err.Error())
}

2、客户端请求时控制超时

resquest := math_service.SubRequest{Left: 8, Right: 5}
response, err := client.Sub(context.Background(), &resquest,
    callopt.WithConnectTimeout(100*time.Millisecond),  // 连接超时
    callopt.WithRPCTimeout(200*time.Millisecond),      // RPC连接超时
)
if err != nil {
    klog.Error(err)
} else {
    klog.Info(response.Diff)
}

预热

在 Kitex 这类高性能 RPC 框架中,预热(Warming Up) 是指在客户端正式接收业务流量前,提前完成部分初始化操作,避免第一次请求时因耗时操作导致超时或性能抖动。

预热的核心目的

  • 避免冷启动耗时:第一次请求需要做服务发现、建立连接、序列化器初始化等操作,耗时会明显高于后续请求,预热可以把这些耗时操作提前完成。
  • 提升首次请求成功率:在服务刚上线或客户端刚启动时,提前建立连接、验证服务可用性,避免第一次请求就失败。
client.WithWarmingUp(&warmup.ClientOption{
    ResolverOption: &warmup.ResolverOption{
        Dests: []*rpcinfo.EndpointBasicInfo{
            {
                ServiceName: "dqq.math",
            },
        },
    },
}),

这段代码里的预热做了什么?

这段 WithWarmingUp 配置,是 Kitex 提供的客户端预热功能,具体做了两件事:

  • 服务发现预热:提前向注册中心拉取 dqq.math 服务的实例列表,缓存到本地,避免第一次请求时才去解析地址。
  • 连接预热(可选):根据配置,提前和服务端建立长连接,避免第一次请求时才完成 TCP 三次握手、TLS 握手等连接过程。
About Me

没什么想介绍的,一个很大众的码农…

喜欢代码,车,马,真的是 🐎

讨厌别人让我给自己的代码写注释 最厌烦别人的程序没有写注释

目标

学AI,加油!加油!