【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 检测连接是否仍然活跃,减少意外断开造成的请求失败。
  • 优化资源管理:通过空闲超时和最大连接时长策略,释放长期不活动的连接,节省资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950379.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ STL map和set的使用

序列式容器和关联式容器 想必大家已经接触过一些容器如:list,vector,deque,array,forward_list,string等,这些容器统称为系列容器。因为逻辑结构为线性的,两个位置的存储的值一般是…

人工智能及深度学习的一些题目(三)

1、【填空题】 使用RNNCTC模型进行语音识别,在产生预测输出时,对于输入的音频特征序列通过网络预测产生对应的字母序列,可以使用( beamsearch )算法进行最优路径搜索。 2、【填空题】 逻辑回归模型属于有监督学习中的&…

《C++11》右值引用深度解析:性能优化的秘密武器

C11引入了一个新的概念——右值引用,这是一个相当深奥且重要的概念。为了理解右值引用,我们需要先理解左值和右值的概念,然后再理解左值引用和右值引用。本文将详细解析这些概念,并通过实例进行说明,以揭示右值引用如何…

cp命令详解

🏝️专栏:计算机操作系统 🌅主页:猫咪-9527主页 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 1. 基本功能 2. 命令语法 3. 常用选项 4. 常见用法示例 4.1 复制单个文件 4.2 递归复制目录…

Git的学习和常见问题

文章目录 1.初始化配置2.新建仓库3.添加和提交文件4.git reset 回退版本5.git diff 查看差异6.git rm 删除文件7.文件 .gitigonre8.克隆远程仓库9.将已有的本地仓库关联到远程仓库10.分支的基本操作11.解决合并冲突配置问题 最近基于GeekHour的视频学习Git,记录了一…

《Mcal》--MCU模块

一、MCU模块的主要功能 控制系统时钟的产生。控制系统通用模块,该模块会涉及到Adc、Ftm等外设的配置。控制外设时钟。控制MCU运行的模式。初始化定义RAM Section。 比较重要的是时钟的配置。 二、系统时钟的配置 1、芯片时钟树 要想弄明白时钟配置,需…

【每日学点鸿蒙知识】查看触摸热区范围、直接赋值到剪贴板、组件截图、横竖屏切换、防截图等

1、如何查看触摸热区范围? 前只能通过自定义的方式获取responseRegion。参考文档:触摸热区设置 Entry Component struct TouchTargetExample {State text: string State x:number 0State y:number 0State reg_width:string 50%State reg_height:st…

ThinkPHP 8高效构建Web应用-获取请求对象

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…

记一次k8s下容器启动失败,容器无日志问题排查

问题 背景 本地开发时&#xff0c;某应用增加logback-spring.xml配置文件&#xff0c;加入必要的依赖&#xff1a; <dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>8…

STM32烧写失败之Contents mismatch at: 0800005CH (Flash=FFH Required=29H) !

一&#xff09;问题&#xff1a;用ULINK2给STM32F103C8T6下载程序&#xff0c;下载方式设置如下&#xff1a; 出现下面两个问题&#xff1a; 1&#xff09;下载问题界面如下&#xff1a; 这个错误的信息大概可以理解为&#xff0c;在0x08000063地址上读取到flash存储为FF&am…

vscode通过ssh连接服务器实现免密登录

一、通过ssh连接服务器 1、打开vscode&#xff0c;进入拓展&#xff08;CtrlShiftX&#xff09;&#xff0c;下载拓展Remote - SSH。 2、点击远程资源管理器选项卡&#xff0c;选择远程&#xff08;隧道/SSH&#xff09;类别。 3、点击SSH配置。 4、在中间上部分弹出的配置文件…

在Nvidia Jetson ADX Orin中使用TensorRT-LLM运行llama3-8b

目录 背景&#xff1a;步骤 1.获取模型权重第 2 步&#xff1a;准备第 3 步&#xff1a;构建 TensorRT-LLM 引擎 背景&#xff1a; 大型语言模型 &#xff08;LLM&#xff09; 推理的关键瓶颈在于 GPU 内存资源短缺。因此&#xff0c;各种加速框架主要强调减少峰值 GPU 内存使…

Unity Shader学习日记 part4 Shader 基础结构

其实在这一篇之前&#xff0c;应该还有一个关于坐标空间转换的内容&#xff0c;但是内容囤积的有些多&#xff0c;就先把Shader的基础结构先记录一下。 笔记主要记录在代码中&#xff0c;所以知识点主要是图和代码的展示。 Unity Shader分类 在Unity中&#xff0c;Shader的种…

特征点检测与匹配——MATLAB R2022b

特征点检测与匹配在计算机视觉中的作用至关重要,它为图像处理、物体识别、增强现实等领域提供了坚实的基础。 目录 Harris角点检测 SIFT(尺度不变特征变换) SURF(加速稳健特征) ORB(Oriented FAST and Rotated BRIEF) 总结 特征点检测与匹配是计算机视觉中的一项基…

Airflow:HttpSensor实现API驱动数据流程

数据管道工作流通常依赖于api来访问、获取和处理来自外部系统的数据。为了处理这些场景&#xff0c;Apache Airflow提供了HttpSensor&#xff0c;这是一个内置的Sensor&#xff0c;用于监视HTTP请求的状态&#xff0c;并在满足指定条件时触发后续任务。在这篇博文中&#xff0c…

图数据库 | 17、高可用分布式设计(上)

我们在前面的文章中&#xff0c;探索了多种可能的系统扩展方式&#xff0c;以及每种扩展方式的优劣。 本篇文章将通过具体的架构设计方案来对每一种方案的设计、投入产出比、各项指标与功能&#xff0c;以及孰优孰劣等进行评价。 在设计高性能、高可用图数据库的时候&#xf…

JAVA学习记录1

文章为个人学习记录&#xff0c;仅供参考&#xff0c;如有错误请指出。 什么是JAVA&#xff1f; JAVA是一种高级的编程语言&#xff0c;可以用于开发大部分场景的软件&#xff0c;但主要用于服务器的开发。 什么是JDK&#xff1f; 类似于python使用PyCharm来编写代码&#…

css中的部分文字特性

文章目录 一、writing-mode二、word-break三、word-spacing;四、white-space五、省略 总结归纳常见文字特性&#xff0c;后续补充 一、writing-mode 默认horizontal-tbwriting-mode: vertical-lr; 从第一排开始竖着排&#xff0c;到底部再换第二排&#xff0c;文字与文字之间从…

Android wifi常见问题及分析

参考 Android Network/WiFi 那些事儿 前言 本文将讨论几个有意思的网络问题&#xff0c;同时介绍 Android 上常见WiFi 问题的分析思路。 网络基础Q & A 一. 网络分层缘由 分层想必大家很熟悉&#xff0c;是否想过为何需要这样分层&#xff1f; 网上大多都是介绍每一层…

【C语言】_指针与数组

目录 1. 数组名的含义 1.1 数组名与数组首元素的地址的联系 1.3 数组名与首元素地址相异的情况 2. 使用指针访问数组 3. 一维数组传参的本质 3.1 代码示例1&#xff1a;函数体内计算sz&#xff08;sz不作实参传递&#xff09; 3.2 代码示例2&#xff1a;sz作为实参传递 3…