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

Posted 卡布奇诺-海晨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微服务Nacos为什么丢弃短连接(http)而选择拥抱长连接(gRPC)相关的知识,希望对你有一定的参考价值。

目录

一、现状背景

二、场景分析

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

💖微服务实战

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

以上是关于微服务Nacos为什么丢弃短连接(http)而选择拥抱长连接(gRPC)的主要内容,如果未能解决你的问题,请参考以下文章

微服务Nacos ⼀致性协议

微服务初体验(二):使用Nacos作为配置中心并集成Dubbo

什么是Nacos

使用nacos配置中心后启动微服务连接不上nacos的问题

AlibabaSpringCloudAlibaba微服务组件Nacos

SpringCloudAlibaba微服务组件Nacos注册中心