当前位置: 首页 > article >正文

【Nacos架构 原理】内核设计之Nacos通信通道

文章目录

      • Nacos通信通道 (长链接)
        • 现状背景
        • 场景分析
          • 配置
          • 服务
        • 长链接核心诉求
          • 功能性诉求
          • 负载均衡
          • 连接生命周期

Nacos通信通道 (长链接)

现状背景

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

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

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

场景分析
配置

配置对连接的场景诉求分析
在这里插入图片描述

  • SDK和Server之间
    • 客户端SDK需要感知服务节点列表,并按照某种策略选择其中一个节点进行连接;底层连接断开时,需要进行切换Server进行重连。
    • 客户端基于当前可用的长链接进行配置的查询,发布,删除监听,取消监听等配置领域的RPC语意接口通信。
    • 感知配置变更消息,需要将配置变更消息通知推送当前监听的客户端;网络不稳定时,客户端接收失败,需要支持重推,并告警。
    • 感知客户端连接断开事件,将连接注销,并且清空连接对应的上下文,比如监听信息上下文清理
服务
  • SDK 和 Server 之间
    • 客户端 SDK 需要感知服务节点列表,并按照某种策略选择其中一个节点进行连接;底层连接断开时,需要切换 Server 进行重连。
    • 客户端基于当前可用的长链接进行配置的查询,注册,注销,订阅,取消订阅等服务发现领域的RPC 语意接口通信。
    • 感知服务变更,有服务数据发生变更,服务端需要推送新数据到客户端;需要有推送 ack(SDK返回给服务端),方便服务端进行 metrics 和重推判定等。
    • 感知客户端连接断开事件,将连接注销,并且清空连接对应的上下文,比如该客户端连接注册的服务和订阅的服务。
  • Server 之间通信
    • 服务端之间需要通过长连接感知对端存活状态,需要通过长连接汇报服务状态(同步 RPC 能力)
    • 服务端之间进行 AP Distro 数据同步,需要异步 RPC 带 ack 能力。
长链接核心诉求

在这里插入图片描述

功能性诉求

客户端

  • 连接生命周期实时感知能力,包括连接建立,连接断开事件
  • 客户端调用服务端支持同步阻塞,异步future,异步 callback 三种模式
  • 底层连接自动切换能力
  • 响应服务端连接重置消息进行连接切换
  • 选址/服务发现
    服务端
  • 连接生命周期实时感知能力,包括连接建立,连接断开事件
  • 服务端往客户端主动进行数据推送,需要客户端进行 Ack 返回以支持可靠推送,并且需要进行失败重试
  • 服务端主动推送负载调节能力
负载均衡
  • 常见的负载均衡策略:随机,hash,轮询,权重,最小连接数,最快响应速度等
  • 短连接和长链接负载均衡的异同;
    • 短连接中,因为连接快速建立销毁,“随机,hash,轮询,权重”四种方式大致能够保持整体是均衡的,服务端重启也不会影响整体均衡,其中“最小连接数,最快响应速度”是有状态的算法,因为数据延时容易造成堆积效应.
    • 长连接因为建立连接后,如果没有异常情况出现,连接会一直保持断连后需要重新选择一个新的服务节点,当出现服务节点发布重启后,最终连接会出现不均衡的情况出现,“随机,轮询,权重”的策略在客户端重连切换时可以使用,“最小连接数,最快响应速度”和短连接一样也会出现数据延时造成堆积效应。长连接和短连接的一个主要差别在于在整体连接稳定时服务端需要一个rebalance的机制,将集群视角的连接数重新洗牌分配,趋向另外一种稳态
  • 客户端随机+服务端柔性调整:
    • 核心的策略是客户端+服务端双向调节策略,客户端随机选择+服务端运行时柔性调整。

    • 在这里插入图片描述

    • 客户端随机

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

      • (当前实现版本)人工管控方案:集群视角的系统负载控制台,提供连接数,负载等视图(扩展新增连接数,负载,CPU 等信息,集群间 report 同步),实现人工调节每个 Server 节点的连接数,人工触发reblance,人工削峰填谷

        • 提供集群视角的负载控制台:展示 总节点数量,总长链接数量,平均数量,系统负载信息
        • 每个节点的地址,长链接数量,与平均数量的差值,正负值
        • 对高于平均值的节点进行数量调控,设置数量上限(临时和持久化),并可指定服务节点进行切换
      • (未来终态版本)自动化管控方案:基于每个 server 间连接数及负载自动计算节点合理连接数,自动触发reblance,自动削峰填谷。实现周期较长,比较依赖算法准确性。

连接生命周期

心跳保活机制:

类型TCPnettyminagrpcrsockettb remote
心跳保活机制keepalive机制:通道无读写事件时,发送心跳包检测,可设置超时时间,间隔次数1.设置TCP参数

2.自定义心跳IdeHandler,监听通道读写事件
1.自定义心跳,KeepAliveFilter1.自定义心跳,ping-pong包探测1.自定义keep alive机制基于mina,KeepAliveFilter
事件通知正常关闭有事件通知有事件通知有事件通知有事件通知有事件通知有事件通知
断网异常keep alive机制,有事件通知tpc及自定义心跳,有事件通知自定义心跳,有事件通知自定义心跳,ping-pong包探测,无事件通知1.自定义心跳,有事件通知自定义心跳,有事件通知z自定义心跳,有事件通知。

http://www.kler.cn/news/328702.html

相关文章:

  • 生信初学者教程(二十一):LASSO+LR筛选候选标记物
  • 常用JS代码片段分享(总结)
  • 论文笔记——Graph Bottlenecked Social Recommendation
  • 【文件增量备份系统】MySQL百万量级数据量分页查询性能优化
  • vue3 父子组件调用
  • 【学习笔记】手写 Tomcat 八
  • python获取当月最后工作日实现在数据库查询指定日期数据(python+sql)
  • B+树索引结构的优点
  • 习题1 程序设计和C语言
  • 08-Registry搭建docker私仓
  • Python 如何使用 Pandas 进行数据分析
  • 实战OpenCV之轮廓检测
  • 828华为云征文|部署在线文档应用程序 CodeX Docs
  • cisp-pte多少钱考一次?cisp-pte报考费用及报考条件一次说清楚!
  • ARM V8 A32常用指令集
  • 华为OD机试真题---找终点
  • excel 处理数据的常用场景之考勤表的制作
  • 递归函数设计技巧
  • 一次实践:给自己的手机摄像头进行相机标定
  • 【小沐学GIS】基于ubuntu+three.js的OSM建筑模型显示(node.js、Python)
  • 【论文阅读】基于真实数据感知的模型功能窃取攻击
  • 区块链可投会议CCF C--FC 2025 截止10.8 附录用率
  • 滚雪球学MySQL[1.2讲]:安装与配置
  • Qt界面编程01
  • python-patterns:Python 设计模式大全
  • 个人项目简单https服务配置
  • STL之list篇(上)初识list容器,了解其核心机制,实例化对象进行分析
  • Angular 2 用户输入
  • 安全的价值:构建现代企业的基础
  • k8s篇之数据挂载类型及区别