【grpc】 4.keepalive
- 定期发送HTTP/2.0 pings帧来检测 connection 是否存活,如果断开则进行重新连接。
- keepalive ping是一种通过transport发送HTTP2 ping来检查通道当前是否工作的方法。它是周期性发送的,如果在某个超时周期内该ping没有得到对等方的确认,则传输断开连接。
- 与健康检查区别在于keepalive是检查connection, 而健康检查是检查服务是否可用。
- gRPC 的 Keepalive 机制用于检测和维护客户端与服务器之间的长连接状态。客户端和服务器可以相互发送心跳包,以确保连接处于活跃状态。如果在一定时间内没有收到心跳包,则会认为连接已经断开,会将连接关闭并触发重连机制。
# 官方实现
https://pkg.go.dev/google.golang.org/grpc/keepalive
- 包名: google.golang.org/grpc/keepalive
# grpc keepalive 与 http keepalive 区别
- gRPC 的 Keepalive 和 HTTP 1.1 的 Keepalive 是不同的机制,虽然它们都用于保持长连接并避免频繁建立连接的开销。下面是它们的一些主要区别:
- 机制类型 gRPC 的 Keepalive 是一种自定义的机制,用于维护客户端和服务器之间的长连接状态。HTTP 1.1 的 Keepalive 是一种标准的机制,用于避免在客户端和服务器之间频繁建立连接。
- 实现方式 gRPC 的 Keepalive 机制是基于 TCP 协议的心跳包实现的,可以在长时间的空闲期间发送心跳包来保持连接状态。HTTP 1.1 的 Keepalive 机制则是在 HTTP 协议层面上实现的,通过在 HTTP 报文头中添加
Connection: Keep-Alive
标识来告知服务器保持连接。 - 适用范围 gRPC 的 Keepalive 机制适用于基于 gRPC 协议的应用程序,主要用于保持客户端和服务器之间的长连接状态。HTTP 1.1 的 Keepalive 机制适用于基于 HTTP 1.1 协议的应用程序,主要用于优化 HTTP 请求的性能。 综上所述,gRPC 的 Keepalive 和 HTTP 1.1 的 Keepalive 机制虽然都用于保持长连接并避免频繁建立连接的开销,但它们是不同的机制,适用于不同的应用场景和协议。
# 代码示例
server.go
var kaep = keepalive.EnforcementPolicy{ MinTime: 5 * time.Second, // If a client pings more than once every 5 seconds, terminate the connection PermitWithoutStream: true, // Allow pings even when there are no active streams } var kasp = keepalive.ServerParameters{ MaxConnectionIdle: 15 * time.Second, // If a client is idle for 15 seconds, send a GOAWAY MaxConnectionAge: 30 * time.Second, // If any connection is alive for more than 30 seconds, send a GOAWAY MaxConnectionAgeGrace: 5 * time.Second, // Allow 5 seconds for pending RPCs to complete before forcibly closing connections Time: 5 * time.Second, // Ping the client if it is idle for 5 seconds to ensure the connection is still active Timeout: 1 * time.Second, // Wait 1 second for the ping ack before assuming the connection is dead } server := grpc.NewServer(grpc.KeepaliveEnforcementPolicy(kaep), grpc.KeepaliveParams(kasp))
1
2
3
4
5
6
7
8
9
10
11
12
13
14client.go
var kaep = keepalive.EnforcementPolicy{ MinTime: 5 * time.Second, // If a client pings more than once every 5 seconds, terminate the connection PermitWithoutStream: true, // Allow pings even when there are no active streams } var kasp = keepalive.ServerParameters{ MaxConnectionIdle: 15 * time.Second, // If a client is idle for 15 seconds, send a GOAWAY MaxConnectionAge: 30 * time.Second, // If any connection is alive for more than 30 seconds, send a GOAWAY MaxConnectionAgeGrace: 5 * time.Second, // Allow 5 seconds for pending RPCs to complete before forcibly closing connections Time: 5 * time.Second, // Ping the client if it is idle for 5 seconds to ensure the connection is still active Timeout: 1 * time.Second, // Wait 1 second for the ping ack before assuming the connection is dead } server := grpc.NewServer(grpc.KeepaliveEnforcementPolicy(kaep), grpc.KeepaliveParams(kasp))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
上次更新: 2023/05/04, 15:30:48