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

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌

博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+MySQL+Vue等前后端分离项目,可以在左边的分类专栏找到更多项目。《Uniapp项目案例》有几个有uniapp教程,企业实战开发。《微服务实战》专栏是本人的实战经验总结,《Spring家族及微服务系列》专注Spring、SpringMVC、SpringBoot、SpringCloud系列、Nacos等源码解读、热门面试题、架构设计等。除此之外还有不少文章等你来细细品味,更多惊喜等着你哦

🍅uniapp微信小程序🍅面试题软考题免费使用,还可以使用ChatGPT,微信支付,扫码加群

点击这里预览

🍅开源项目免费哦(有vue2与vue3版本):点击这里克隆或者下载     🍅

🍅文末获取联系🍅精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟

Java项目案例《100套》

https://blog.csdn.net/qq_57756904/category_12173599.html

uniapp小程序《100套》
https://blog.csdn.net/qq_57756904/category_12199600.html

目录

一、现状背景

二、场景分析

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 间⼀致性

面试软考题ChatGPT微信支付等等

💖微服务实战

【微服务】SpringCloud的OpenFeign与Ribbon配置

集Oauth2+Jwt实现单点登录

Spring Cloud Alibaba微服务第29章之Rancher

Spring Cloud Alibaba微服务第27章之Jenkins

Spring Cloud Alibaba微服务第24章之Docker部署

Spring Cloud Alibaba微服务第23章之Oauth2授权码模式

Spring Cloud Alibaba微服务第22章之Oauth2

Spring Cloud Alibaba微服务第21章之分布式事务

Spring Cloud Alibaba微服务第18章之消息服务

Spring Cloud Alibaba微服务第16章之服务容错

Spring Cloud Alibaba微服务第14章之分库分表

Spring Cloud Alibaba微服务第11章之MyBatis-plus

Spring Cloud Alibaba微服务第8章之OpenFeign

Spring Cloud Alibaba微服务第7章之负载均衡Ribbon

SpringCloud Alibaba微服务第6章之Gateway

SpringCloud Alibaba微服务第4章之Nacos

💖 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执行流程图解及源码

  • 64
    点赞
  • 246
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 66
    评论
评论 66
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

卡布奇诺-海晨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值