【微服务】Nacos为什么放弃短连接(http)而选择拥抱长连接(gRPC)

news2024/11/18 3:30:44

目录

一、现状背景

二、场景分析

1、配置

2、服务

三、长连接核心诉求

1、功能性诉求

1.1、客户端

1.2、服务端

2、性能

3、负载均衡

4、连接生命周期

4.1、心跳保活机制

4.2、需要什么

四、长连接选型对比

五、基于长链接的⼀致性模型

1.、配置⼀致性模型

1.1、server 间⼀致性

2、服务⼀致性模型

2.1、sdk-server 间⼀致性

2.2、server 间⼀致性

💖 Spring家族及微服务系列文章 


一、现状背景

Nacos 1.x 版本 Config/Naming 模块各自的推送通道都是按照自己的设计模型来实现的。

产品推送模型数据一致性痛点说明
Nacos Config异步 Servlet基于 MD5 比
对⼀致性
http 短连接,30 秒定
期创建销毁连接,GC
压力大
md5 值计算也有⼀定
开销,在可接受范围内
Nacos NamingHTTP/UDPUDP 推送
+ 补偿查询
丢包,云架构下无法
反向推送

配置和服务器模块的数据推送通道不统⼀,http 短连接性能压力巨大,未来 Nacos 需要构建能够同时支持配置以及服务的长链接通道,以标准的通信模型重构推送通道。

二、场景分析

1、配置

配置对连接的场景诉求分析

SDK 和 Server 之间

  • 客户端 SDK 需要感知服务节点列表,并按照某种策略选择其中⼀个节点进行连接;底层连接断开时,需要进行切换 Server 进行重连。
  • 客户端基于当前可用的长链接进行配置的查询,发布,删除,监听,取消监听等配置领域的 RPC 语意接口通信。
  • 感知配置变更消息,需要将配置变更消息通知推送当前监听的客户端;网络不稳定时客户端接收失败,需要支持重推并告警
  • 感知客户端连接断开事件,将连接注销,并且清空连接对应的上下文,比如监听信息上下文清理。

Server 之间通信

  • 单个 Server 需要获取到集群的所有 Server 间的列表,并且为每⼀个 Server 创建独立的长链接;连接断开时,需要进行重连服务端列表发生变更时,需要创建新节点的长链接,销毁下线的节点长链接
  • Server 间需要进行数据同步,包括配置变更信息同步,当前连接数信息,系统负载信息同步,负载调节信息同步等。

2、服务

SDK 和 Server 之间

  • 客户端 SDK 需要感知服务节点列表,并按照某种策略选择其中⼀个节点进行连接;底层连接断开时,需要切换 Server 进行重连。
  • 客户端基于当前可用的长链接进行配置的查询,注册,注销,订阅,取消订阅等服务发现领域的 RPC 语意接口通信。
  • 感知服务变更,有服务数据发生变更,服务端需要推送新数据到客户端;需要有推送 ack,方便服务端进行 metrics 重推判定等。
  • 感知客户端连接断开事件,将连接注销,并且清空连接对应的上下文,比如该客户端连接注册的服务和订阅的服务。

Server 之间通信

  • 服务端之间需要通过长连接感知对端存活状态,需要通过长连接汇报服务状态(同步 RPC 能力)。
  • 服务端之间进行 AP Distro 数据同步,需要异步 RPC 带 ack 能力

三、长连接核心诉求

1、功能性诉求

1.1、客户端

  • 连接生命周期实时感知能力,包括连接建立,连接断开事件。
  • 客户端调用服务端支持同步阻塞异步 Future异步 CallBack 三种模式。
  • 底层连接自动切换能力。
  • 响应服务端连接重置消息进行连接切换。
  • 选址/服务发现。

1.2、服务端

  • 连接生命周期实时感知能力,包括连接建立,连接断开事件
  • 服务端往客户端主动进行数据推送,需要客户端进行 Ack 返回以支持可靠推送,并且需要进行失败重试
  • 服务端主动推送负载调节能力。

2、性能

性能方面,需要能够满足阿里的生产环境可用性要求,能够支持百万级的长链接规模及请求量和推送量,并且要保证足够稳定。

3、负载均衡

  • 常见的负载均衡策略随机hash轮询权重最小连接数最快响应速度
  • 短连接长链接负载均衡的异同:在短连接中,因为连接快速建立销毁,“随机,hash,轮询,权重”四种方式大致能够保持整体是均衡的,服务端重启也不会影响整体均衡,其中“最小连接数,最快响应速度”是有状态的算法,因为数据延时容易造成堆积效应长连接因为建立连接后,如果没有异常情况出现,连接会⼀直保持,断连后需要重新选择⼀个新的服务节点,当出现服务节点发布重启后,最终连接会出现不均衡的情况出现,“随机,轮询,权重”的策略在客户端重连切换时可以使用,“最小连接数,最快响应速度”和短连接⼀样也会出现数据延时造成堆积效应。长连接和短连接的⼀个主要差别在于在整体连接稳定时,服务端需要⼀个 rebalance 的机制,将集群视角的连接数重新洗牌分配,趋向另外⼀种稳态
  • 客户端随机+服务端柔性调整

       核心的策略是客户端+服务端双向调节策略,客户端随机选择+服务端运行时柔性调整。

客户端随机

  • 客户端在启动时获取服务列表,按照随机规则进行节点选择,逻辑比较简单,整体能够保持随机。

服务端柔性调整

  • (当前实现版本)人工管控方案:集群视角的系统负载控制台,提供连接数,负载等视图(扩展新增连接数,负载,CPU 等信息,集群间 report 同步),实现人工调节每个 Server 节点的连接数,人工触发 reblance,人工削峰填谷。
    ○ 提供集群视角的负载控制台:展示 总节点数量,总长链接数量,平均数量,系统负载信息。
    ○ 每个节点的地址,长链接数量,与平均数量的差值,正负值。

      ○ 对高于平均值的节点进行数量调控,设置数量上限(临时和持久化),并可指定服务节点           进行切换。

  • (未来终态版本)自动化管控方案:基于每个 server 间连接数及负载自动计算节点合理连接数,自动触发 reblance,自动削峰填谷。实现周期较长,比较依赖算法准确性。

4、连接生命周期

4.1、心跳保活机制

4.2、需要什么

  • 低成本快速感知:客户端需要在服务端不可用时尽快地切换到新的服务节点,降低不可用时间,并且能够感知底层连接切换事件,重置上下文;服务端需要在客户端断开连接时剔除客户端连接对应的上下文,包括配置监听,服务订阅上下文,并且处理客户端连接对应的实例上下线。
  1. 客户端正常重启:客户端主动关闭连接,服务端实时感知
  2.  服务端正常重启 : 服务端主动关闭连接,客户端实时感知
  •  防抖
  1. 网络短暂不可用: 客户端需要能接受短暂网络抖动,需要⼀定重试机制,防止集群抖动,超过阈值后需要自动切换 server,但要防止请求风暴。
  • 断网演练:断网场景下,以合理的频率进行重试,断网结束时可以快速重连恢复。

四、长连接选型对比

     在当前的备选框架中,从功能的契合度上,Rsocket 比较贴切我们的功能性诉求,性能上比 grpc要强⼀些,开源社区的活跃度上相对 grpc 要逊色很多。

    所以在Nacos2.x的长连接通信模型中选取了谷歌开源的gRPC框架,而弃用http短链接。

五、基于长链接的⼀致性模型

1.、配置⼀致性模型

1.1、server 间⼀致性

Server 间同步消息接收处理轻量级实现,重试失败时,监控告警。
断网:断网太久,重试任务队列爆满时,无剔除策略。
 

2、服务⼀致性模型

2.1、sdk-server 间⼀致性

2.2、server 间⼀致性

💖 Spring家族及微服务系列文章 

✨【Spring】一文带你吃透IOC容器技术

✨【微服务】SpringCloud中OpenFeign请求处理及负载均衡流程

✨【微服务】SpringCloud中Ribbon的WeightedResponseTimeRule策略

✨【微服务】SpringCloud中Ribbon的轮询(RoundRobinRule)与重试(RetryRule)策略

✨【微服务】SpringCloud中Ribbon集成Eureka实现负载均衡

✨【微服务】SpringCloud轮询拉取注册表及服务发现源码解析

✨【微服务】SpringCloud微服务续约源码解析

✨【微服务】SpringCloud微服务注册源码解析

✨【微服务】Nacos2.x服务发现?RPC调用?重试机制?

✨【微服务】Nacos通知客户端服务变更以及重试机制

✨【微服务】Nacos服务发现源码分析

✨【微服务】SpringBoot监听器机制以及在Nacos中的应用

✨【微服务】Nacos服务端完成微服务注册以及健康检查流程

✨【微服务】Nacos客户端微服务注册原理流程

✨【微服务】SpringCloud中使用Ribbon实现负载均衡的原理

✨【微服务】SpringBoot启动流程注册FeignClient

✨【微服务】SpringBoot启动流程初始化OpenFeign的入口

✨Spring Bean的生命周期

✨Spring事务原理

✨SpringBoot自动装配原理机制及过程

✨SpringBoot获取处理器流程

✨SpringBoot中处理器映射关系注册流程

✨Spring5.x中Bean初始化流程

✨Spring中Bean定义的注册流程

✨Spring的处理器映射器与适配器的架构设计

✨SpringMVC执行流程图解及源码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软件测试】8年测试老鸟的解读,测试人你的发展?测试开发......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 测试开发到底是测试…

引擎入门 | Unity UI简介–第3部分(3)

本期我们继续为大家进行Unity UI简介(第三部分)的后续教程 本篇内容 7.使面板上下滑动 文章末尾可免费获取教程源代码 本篇本篇Unity UI简介(第三部分)篇幅较长,分为八篇,本篇为第三篇。 7.使面板上下…

第6章 关系代数语言

第6章 关系代数语言 考试范围:6.1 考试题型:计算题 考试内容:关系代数操作 Selection Projection Join Cartesian product Rename Union set-difference intersection 1、Selection(选行操作) 2、Projection(选列操作) 3、Join N…

rabbitmq基础4——单机多节点集群、多机集群部署、基础功能测试

文章目录一、一机多实例集群1.1 三机启动1.2 立主纳从1.3 查看集群状态1.4 web监控1.5 测试1.5.1 数据同步1.5.2 一从死,主仍战1.5.3 从复活,死亡期间数据同步1.5.4 主死,从活但不可用二、多机集群2.1 确定主机名2.2 三机部署rabbitmq2.3 设主…

白话说Java虚拟机原理系列【第二章】:Class字节码文件详解

前导说明: 本文基于《深入理解Java虚拟机》第二版和个人理解完成, 以大白话的形式期望能用大家都看懂的描述讲清楚虚拟机内幕, 后续会增加基于《深入理解Java虚拟机》第三版内容,并进行二个版本的对比。 Class字节码文件的数据结构…

ChatGPT 帮我跑了一个完整的 DevOps 流水线,离了个大谱...

大家好,我是米开朗基杨。上篇文章给大家介绍了👉如何将 N 个 ChatGPT 账号接入微信,今天就来给大家演示一下如何利用 ChatGPT 帮我工作,让自己有更多的时间摸鱼!上篇文章还没看的赶紧去看👇我将 9 个 ChatG…

SpringBoot2核心技术(核心功能)- 05、Web开发【5.3 请求参数处理】

5.3、请求参数处理 0、请求映射 1、rest使用与原理 xxxMapping;Rest风格支持(使用HTTP请求方式动词来表示对资源的操作) 以前:/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户 现在&#xff1…

Google 释出开源软件漏洞扫描工具 OSV-Scanner​

开源开发人员可在项目使用 OSV-Scanner,透过比对依赖项目和 OSV 漏洞资料库,找出项目的依赖项目中所存在的漏洞。Google 推出免费工具 OSV-Scanner(https://github.com/google/osv-scanner),供开源开发人员可以更简单地…

docker网络模式 与 搭建nginx

目录 1. docker网络模式 2. 连接容器的三种方法 3. Docker Networking 3.1 创建网络 3.2 查看宿主机中创建的网络 3.3 删除网络 3.3 如何使用网络 4.搭建Nginx 1.准备工作 1.1 拉取镜像 1.2 在宿主机中创建挂载目录 2.准备2个tomcat 容器集群 3.准备 Nginx配置 3.…

ffmpeg 命令的简单使用

ffmpeg命令是在windows端使用的,使用前,需要先下载对应的 exe文件 1.准备环境 访问FFmpeg官网的下载地址(https://www.gyan.dev/ffmpeg/builds/)下载对应的压缩包,解压后即可使用 2.使用 ffmpeg.exe的使用 • 功能 …

利用Clion编译器完成C++的头文件与源文件的映射

1、前言 嘿嘿,众所周知,本人是一名Java后端人员,那么为什么开始搞C/C了咧? 因为Java是在C/C的基础上开发的语言,而且性能也是业界公认的除了机器语言外最好的编程语言,所以我就想啊,如果将Java…

记一次返工

记一次返工 作者:Grey 原文地址: 博客园:记一次返工 CSDN:记一次返工 本文搬运自自己的博客园博客,发布于 2018-05-12 说明 本周我经历了参加工作以来,最大的一次返工,这一周都是茶饭不思…

安全灵活,华为云桌面成为数字化办公最佳搭档

目前云上数字化办公已经是大势所趋,但是如何快速高效地为用户提供便捷高效的工作和生活体验,依然需要大量的技术投入来实现。而华为云桌面就是云上办公的门户与平台,它可以将各种业务系统在云端进行集中管理与调度,通过统一的接口…

二、collection接口

文章目录Collection接口和常用方法(以ArrayList为例)基本使用方法遍历元素方式1(iterator)遍历元素方式2(增强for)练习Collection接口和常用方法(以ArrayList为例) 以ArrayList,其他集合同理使用 基本使用方法 注:集合添加基本数据类型会自动装箱成对…

非零基础自学Golang 第15章 Go命令行工具 15.1 编译相关指令 15.1.2 run

非零基础自学Golang 文章目录非零基础自学Golang第15章 Go命令行工具15.1 编译相关指令15.1.2 run第15章 Go命令行工具 15.1 编译相关指令 15.1.2 run 我们在调试代码时通常会使用go run命令。 该命令会编译执行Go语言源码,不会在当前目录生成可执行文件&#x…

【LeetCode每日一题:1799. N 次操作后的最大分数和~~~记忆化搜索+动态规划+状态压缩+最大公约数】

题目描述 给你 nums ,它是一个大小为 2 * n 的正整数数组。你必须对这个数组执行 n 次操作。 在第 i 次操作时(操作编号从 1 开始),你需要: 选择两个元素 x 和 y 。 获得分数 i * gcd(x, y) 。 将 x 和 y 从 nums 中…

07. 渗透测试之针对网站的信息收集

07. 渗透测试之针对网站的信息收集 01 信息收集简介 什么是信息收集 信息收集(Information Gathering)是指通过各种方式获取所需要的信息。信息收集是信息得以利用的第一步,也是关键的一步。信息收集工作的好坏,会影响整个渗透…

全国各城市疫情达峰进度条感染高峰时间表最新

防疫政策放开之后,多位专家就研判,未来一个多月内全国疫情将达到感染高峰。而近日,一张全国各地疫情进度和最终高峰的预计时间表流传,对各城市首轮感染高峰期进行了预测。那么,全国各城市疫情达峰进度条如何了&#xf…

怎么高效的开发一款成功的产品?Working Backwards

过去的几天一直在回顾整个产品团队过去一年所做的工作,有的工作有亮点,有的工作可以说是乏善可陈。对于不好的,发现其中的一个核心原因就是没有坚持“以终为始”的原则。现将我2021年10月写的一篇公司内部博客再次分享给团队,也分…

Simple Yet Effective Graph Contrastive Learning for Recommendation

1. 摘要 图神经网络(GNN)是一种强大的基于图的推荐系统学习方法。最近,结合对比学习的gnn在处理高度稀疏数据时,在数据增强方案的推荐方面表现出了优异的性能。尽管它们取得了成功,但大多数现有的图对比学习方法要么在用户-项目交互图上执行随…