当前位置: 首页 > article >正文

【gRPC】Keepalive连接保活配置,go案例

gRPC Keepalive 保活策略

配置主要用于维持客户端与服务端之间的长连接,避免连接在空闲时被网络中间层(如负载均衡器、代理等)关闭或断开。它可以帮助在不活跃期间定期发送保活信号来检测连接是否仍然有效。

服务端 Keepalive 配置参数:

  • MaxConnectionIdle: 如果连接在指定时间内未活动(没有任何 RPC 请求),服务端会关闭连接。
  • MaxConnectionAge: 设置连接的最大存活时间,当超过此时间,服务端会强制关闭连接。
  • MaxConnectionAgeGrace: 在关闭连接之前给予客户端一段宽限时间,用于完成未完成的 RPC。
  • KeepaliveTime: 服务端发送 Keepalive PING 帧的频率(仅在连接空闲时)。
  • KeepaliveTimeout: 如果 PING 帧在指定时间内未收到响应,服务端会认为连接不可用。

客户端 Keepalive 配置参数:

  • Time: 客户端发送 Keepalive PING 帧的间隔时间。
  • Timeout: 如果 PING 帧在指定时间内未收到响应,客户端会认为连接不可用。
  • PermitWithoutStream: 是否允许在没有活动 RPC 的情况下发送 Keepalive PING。

1. 服务端配置示例:

import (
	"log"
	"net"
	"time"

	"google.golang.org/grpc"
	"google.golang.org/grpc/keepalive"
)

func main() {
	kaPolicy := keepalive.ServerParameters{
		MaxConnectionIdle:     5 * time.Minute,  // 超过5分钟空闲就关闭连接
		MaxConnectionAge:      30 * time.Minute, // 每个连接最多存活30分钟
		MaxConnectionAgeGrace: 5 * time.Second,  // 关闭前有5秒宽限期
		KeepaliveTime:         2 * time.Minute,  // 每2分钟发送一次PING帧
		KeepaliveTimeout:      20 * time.Second, // 20秒未收到响应认为连接不可用
	}

	grpcServer := grpc.NewServer(grpc.KeepaliveParams(kaPolicy))

	// 注册服务...
	lis, err := net.Listen("tcp", ":50051")
	if err != nil {
		log.Fatalf("Failed to listen: %v", err)
	}
	log.Println("gRPC server running on port :50051")
	if err := grpcServer.Serve(lis); err != nil {
		log.Fatalf("Failed to serve: %v", err)
	}
}

2. 客户端配置示例:

import (
	"log"
	"time"

	"google.golang.org/grpc"
	"google.golang.org/grpc/keepalive"
)

func main() {
	kaPolicy := keepalive.ClientParameters{
		Time:                1 * time.Minute, // 每分钟发送一次PING帧
		Timeout:             10 * time.Second, // PING未响应10秒则断开连接
		PermitWithoutStream: true,             // 即使没有活动流也发送PING帧
	}

	conn, err := grpc.Dial(
		"localhost:50051",
		grpc.WithInsecure(),                // 示例使用非安全连接
		grpc.WithKeepaliveParams(kaPolicy), // 应用Keepalive策略
	)
	if err != nil {
		log.Fatalf("Failed to connect: %v", err)
	}
	defer conn.Close()

	// 创建客户端并发起请求...
	log.Println("gRPC client connected")
}

3. keepalive配置的作用

  • 防止连接被中间层断开:一些网络中间件会关闭长时间空闲的连接,Keepalive 可以避免这种问题。
  • 快速检测连接状态:通过保活 Ping 检测连接是否仍然活跃,减少意外断开造成的请求失败。
  • 优化资源管理:通过空闲超时和最大连接时长策略,释放长期不活动的连接,节省资源。

http://www.kler.cn/a/500283.html

相关文章:

  • 【前端】【HTML】入门基础知识
  • 【C++入门】详解(中)
  • Nacos 3.0 Alpha 发布,在安全、泛用、云原生更进一步
  • django基于Python的电影推荐系统
  • The First项目报告:浅析自我改进的人工智能代理TAOCAT
  • OpenAI 故障复盘 - 阿里云容器服务与可观测产品如何保障大规模 K8s 集群稳定性
  • 3D立体无人机夜间表演技术详解
  • CCF 赛事介绍
  • 今日总结 2025-01-09
  • 机器人避障不再“智障”:HEIGHT——拥挤复杂环境下机器人导航的新架构
  • CRTP编程模式(奇异递归模板)实现客户端的https管理模块
  • windows 环境下安装yarn命令工具
  • HTB:Paper[WriteUP]
  • vue条件渲染
  • 【灵码助力安全3】——利用通义灵码辅助智能合约漏洞检测的尝试
  • 基于springboot的医药管理系统源码+论文+开题报告
  • 单片机(MCU)-简单认识
  • 119.使用AI Agent解决问题:Jenkins build Pipeline时,提示npm ERR! errno FETCH_ERROR
  • C++ Primer Notes(3): 哪些人可以看C++ Primer
  • 探索微软 M365 安全:全方位守护数字世界
  • 基于单片机的小功率数控调频发射器设计
  • 有效数字和相对误差限的关系
  • Kafka消息队列出现消息堆积如何解决