0


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

一、现状背景

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

💖微服务实战

✨【微服务】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执行流程图解及源码


本文转载自: https://blog.csdn.net/qq_57756904/article/details/128401138
版权归原作者 卡布奇诺-海晨 所有, 如有侵权,请联系我们删除。

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

还没有评论