gRPC(Java) keepAlive机制研究

结论

  1. gRPC keepAlive是grpc框架在应用层面连接保活的一种措施。即当grpc连接上没有业务数据时,是否发送pingpong,以保持连接活跃性,不因长时间空闲而被Server或操作系统关闭
  2. gRPC keepAlive在client与server都有,client端默认关闭(keepAliveTime为Long.MAX_VALUE), server端默认打开,keepAliveTime为2小时,即每2小时向client发送一次ping
// io.grpc.internal.GrpcUtil
public static final long DEFAULT_SERVER_KEEPALIVE_TIME_NANOS = TimeUnit.HOURS.toNanos(2L);
  1. KeepAlive的管理使用类io.grpc.internal.KeepAliveManager, 用于管理KeepAlive状态,ping任务调度与执行.

Client端KeepAlive

使用入口

  1. 我们在使用io.grpc框架创建grpc连接的时候,可以设置keeplive, 例如下面:
NettyChannelBuilder builder = NettyChannelBuilder.forTarget(String.format("grpc://%s", provider)) //
      .usePlaintext() //
      .defaultLoadBalancingPolicy(props.getBalancePolicy()) //
      .maxInboundMessageSize(props.getMaxInboundMessageSize()) //
      .keepAliveTime(1,TimeUnit.MINUTES)
      .keepAliveWithoutCalls(true)
      .keepAliveTimeout(10,TimeUnit.SECONDS)
      .intercept(channelManager.getInterceptors()); //
  1. 其中与keepAlive相关的参数有三个,keepAliveTime,keepAliveTimeout,keepAliveWithoutCalls。这三个变量有什么作用呢?
  • keepAliveTime: 表示当grpc连接没有数据传递时,多久之后开始向server发送ping packet
  • keepAliveTimeout: 表示当发送完ping packet后多久没收到server回应算超时
  • keepAliveTimeoutCalls: 表示如果grpc连接没有数据传递时,是否keepAlive,默认为false

简要时序列表

Create & Start


                
gRPC中,Keepalive是一种机制,用于检测和维持客户端和服务器之间的连接状态。通过定期发送心跳包,可以确保连接处于活动状态,并在需要时重新建立连接。 在gRPC中,可以通过设置Keepalive参数来调整心跳包的频率。具体而言,有两个重要的参数可以设置: 1. `keepalive_time`:表示在连接空闲期间,发送第一个心跳包的时间间隔。默认情况下,该值为2小时。如果设置为0,则禁用心跳包。 2. `keepalive_timeout`:表示在发送心跳包后等待响应的超时时间。如果在此时间内没有收到响应,则认为连接已断开。默认情况下,该值为20秒。 这两个参数可以通过gRPC的`ServerOption`和`DialOption`进行设置。例如,在服务器端可以使用以下代码设置Keepalive参数: ```go import "google.golang.org/grpc" server := grpc.NewServer( grpc.KeepaliveParams( keepalive.ServerParameters{ Time: 10 * time.Second, // 设置keepalive_time为10秒 Timeout: 5 * time.Second, // 设置keepalive_timeout为5秒 }, ), ) ``` 在客户端可以使用以下代码设置Keepalive参数: ```go import "google.golang.org/grpc" conn, err := grpc.Dial( address, grpc.WithKeepaliveParams( keepalive.ClientParameters{ Time: 5 * time.Second, // 设置keepalive_time为5秒 Timeout: 3 * time.Second, // 设置keepalive_timeout为3秒 PermitWithoutStream: true, // 允许在没有活动流的情况下发送心跳包 }, ), ) ``` 需要注意的是,Keepalive参数的具体设置可能因不同的编程语言gRPC版本而有所差异。因此,在实际使用中,建议查阅相关文档以获取准确的设置方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jh035512

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值