Nacos架构与原理 - 通信通道

news2024/12/25 9:23:38

文章目录

  • Nacos 长链接
    • ⼀、现状背景
    • 二、场景分析
      • 1. 配置
        • SDK 和 Server 之间
        • Server 之间通信
      • 2. 服务
        • SDK 和 Server 之间
        • Server 之间通信
    • 三、长链接核心诉求
      • 1. 功能性诉求
        • 客户端
        • 服务端
      • 2. 性能要求
      • 3. 负载均衡
        • 客户端随机
        • 服务端柔性调
      • 4. 连接⽣命周期
      • 5. 安全性
      • 6. 低成本多语⾔实现
  • 长链接选型对比
  • 基于长链接的⼀致性模型
    • 1. 配置⼀致性模型
      • sdk-server ⼀致性
      • server 间⼀致性
    • 2. 服务⼀致性模型
      • sdk-server 间⼀致性
      • server 间⼀致性
  • 核心模型组件设计

在这里插入图片描述


Nacos 长链接

⼀、现状背景

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

在这里插入图片描述

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

在这里插入图片描述


二、场景分析

1. 配置

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

在这里插入图片描述

SDK 和 Server 之间

  • 客户端 SDK 需要感知服务节点列表,并按照某种策略选择其中⼀个节点进行连接;底层连接
    断开时,需要进行切换 Server 进行重连。

  • 客户端基于当前可用的长链接进行配置的查询,发布,删除,监听,取消监听等配置领域的 R
    PC 语意接口通信。

  • 感知配置变更消息,需要将配置变更消息通知推送当前监听的客户端;网络不稳定时,客户端
    接收失败,需要支持重推,并告警。

  • 感知客户端连接断开事件,将连接注销,并且清空连接对应的上下文,比如监听信息上下文清
    理。


Server 之间通信

  • 单个 Server 需要获取到集群的所有 Server 间的列表,并且为每⼀个 Server 创建独立的长链接;连接断开时,需要进行重连,服务端列表发生变更时,需要创建新节点的长链接,销毁下线的节点长链接。

  • Server 间需要进行数据同步,包括配置变更信息同步,当前连接数信息,系统负载信息同步,负载调节信息同步等。


2. 服务

SDK 和 Server 之间

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

Server 之间通信

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

三、长链接核心诉求

在这里插入图片描述

1. 功能性诉求

客户端

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

服务端

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


2. 性能要求

能够支持百万级的长链接规模及请求量和推送量,并且要保证足够稳定。


3. 负载均衡

常见的负载均衡策略:随机,hash,轮询,权重,最小连接数,最快响应速度等

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

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

在这里插入图片描述

客户端随机

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

服务端柔性调

(当前实现版本) 人工管控方案

  • 集群视角的系统负载控制台,提供连接数,负载等视图(扩展新增连接数,负载,CPU 等信息,集群间 report 同步),实现人工调节每个 Server 节点的连接数,人工触发 reblance,人工削峰填谷。
  • 提供集群视角的负载控制台:展示 总节点数量,总长链接数量,平均数量,系统负载信息。
  • 每个节点的地址,长链接数量,与平均数量的差值,正负值。
  • 对高于平均值的节点进行数量调控,设置数量上限(临时和持久化),并可指定服务节点进行切换。

 (未来终态版本)自动化管控方案

  • 基于每个 server 间连接数及负载自动计算节点合理连接数,自动触发 reblance,自动削峰填谷。实现周期较长,比较依赖算法准确性。

4. 连接⽣命周期

心跳保活机制

在这里插入图片描述

我们需要什么

 低成本快速感知:客户端需要在服务端不可用时尽快地切换到新的服务节点,降低不可用时间,并且能够感知底层连接切换事件,重置上下文;服务端需要在客户端断开连接时剔除客户端连接对应的上下文,包括配置监听,服务订阅上下文,并且处理客户端连接对应的实例上下线。

  • 客户端正常重启:客户端主动关闭连接,服务端实时感知
  • 服务端正常重启 : 服务端主动关闭连接,客户端实时感知

 防抖:

  • 网络短暂不可用: 客户端需要能接受短暂网络抖动,需要⼀定重试机制,防止集群抖动,超过阈值后需要自动切换 server,但要防止请求风暴。

 断网演练:

  • 断网场景下,以合理的频率进行重试,断网结束时可以快速重连恢复。

5. 安全性

支持基础的鉴权,数据加密能力。

6. 低成本多语⾔实现

在客户端层面要尽可能多的支持多语言,至少要支持⼀个 Java 服务端连接通道,可以使用多个主流语言的客户端进行访问,并且要考虑各种语言实现的成本,双边交互上要考虑 thin sdk,降低多语言实现成本

长链接选型对比

在这里插入图片描述


基于长链接的⼀致性模型

1. 配置⼀致性模型

sdk-server ⼀致性

在这里插入图片描述

server 间⼀致性

在这里插入图片描述


在这里插入图片描述
Server 间同步消息接收处理轻量级实现,重试失败时,监控告警。

断网:断网太久,重试任务队列爆满时,无剔除策略。


2. 服务⼀致性模型

sdk-server 间⼀致性

在这里插入图片描述


server 间⼀致性

在这里插入图片描述

在这里插入图片描述


核心模型组件设计

在这里插入图片描述

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

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

相关文章

基于jsp+mysql+Spring+mybatis的SpringBoot美容院预约管理系统

运行环境: 最好是java jdk 1.8,我在这个平台上运行的。其他版本理论上也可以。 IDE环境: Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以,如果编译器的版本太低,需要升级下编译器,不要弄太低的版本 tomcat服务器环…

数据分析 × 人文社科:高校交叉学科教学经验分享

随着新一轮科技革命与产业变革的加速演进,学科间的交叉融合不断升级,由数据驱动的系列交叉学科备受瞩目,然而,在实际教学与学科建设的过程中,对于数据科学引入至相关学科,高校教师还是普遍面临着比较多的问…

MYSQL中的14个查询技巧

1.group_concat 在我们平常的工作中,使用group by进行分组的场景,是非常多的。 比如想统计出用户表中,名称不同的用户的具体名称有哪些? 具体sql如下: select name from `user` group by name; 但如果想把name相同的code拼接在一起,放到另外一列中该怎么办呢? 答:…

LeetCode - 16 最接近的三数之和

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 16. 最接近的三数之和 - 力扣(LeetCode) 题目描述 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。 请你从 nums 中选出三个整数,使它们的和与 target 最接…

HNU-操作系统OS-作业2(15-22章)

OS_homework_2 这份文件是OS_homework_2 by计科210X wolf 202108010XXX 文档设置了目录,可以通过目录快速跳转至答案部分。 第15章 运行程序OS-homework/vm-mechanism/relocation.py 15.1 用种子 1、2 和 3 运行,并计算进程生成的每个虚拟地址是处于界限内还是界限外? 如…

Python + HDF5 因子计算与 DolphinDB 一体化因子计算方案对比

在量化交易中,基于金融市场的 L1/L2 的报价和交易高频数据来进行高频因子计算,是非常常见的投研需求。目前国内全市场十年的 L2 历史数据约为 20 ~ 50T,每日新增的数据量约为 10 ~ 20G。传统的关系数据库如 MS SQL Server 或 MySQL 已经很难支…

2023届【校招】安全面试题和岗位总结(字节、百度、腾讯、美团等大厂)

写在前面 个人强烈感觉面试因人而异,对于简历上有具体项目经历的同学,个人感觉面试官会着重让你介绍自己的项目,包括但不限于介绍一次真实攻防/渗透/挖洞/CTF/代码审计的经历 > 因此对于自己的项目,面试前建议做一次复盘&#…

Zigbee学习(四)入网流程及抓包分析

Zigbee学习系列文章 Zigbee学习(一)架构及入网 Zigbee学习(二)认识Profile和Cluster Zigbee学习(三)Z-Stack代码框架解析 文章目录 Zigbee学习系列文章前言一、概述二、入网报文解析1.Management Permit J…

双向交错CCM图腾柱无桥单相PFC学习仿真与实现(1)系统问题分解

目录 前言 系统硬件架构 系统软件架构 仿真实现 仿真效果 总结 前言 目前正在做双向交错CCM图腾柱无桥单相PFC的项目,硬件拓扑兼容三相和单相的PFC,三相PFC功能目前已经完成,准备把单相的PFC学习和开发过程记录一下,以及后面…

基于CH32F103的DAC播放WAV功能

一、理论 1.1 DAC理论 数字信号转化为电压信号,实现扬声器不同频率的发声。 12位DAC,表达范围0-4095 1.2音频wav理论 1.2.1 wav文件格式解析 wav 文件一般由3个区块组成:RIFF chunk、Format chunk 和 Data chunk。 RIFF chunk&#xff…

Vivado 下 IP核之单端口 RAM 读写

目录 Vivado 下 IP 核之单端口 RAM 读写 1、RAM 简介 2、实验任务 3、程序设计 3.1、RAM IP 核配置 3.2、时序图讲解 1、写优先模式的时序图如下所示: 2、读优先模式的时序图如下所示: 3、不变模式的时序图如下所示: 3.3、顶层模块…

mysql 数据库 不同数据类型字段设置长度大小、取值范围 及 存储空间

学习目标: 学习的目标 了解不同数据类型字段设置长度大小,从而 在使用 mysql 数据时为使用的字段设置适当的长度 。 学习内容: 学习的内容 整数型字符串型TEXT时间型 总结: 提示:总结 1、整数型 1、整数型的数值…

STM32队列

目录 什么是队列? 队列特点 1. 数据入队出队方式 2. 数据传递方式 3. 多任务访问 4. 出队、入队阻塞 队列相关 API 函数 1. 创建队列 参数: 2. 写队列 参数: 返回值: 3. 读队列 参数: 返回值&#xf…

找工作第一弹——三件套基础巩固

目录 前言HTML篇表格结构a的两种打开方式自定义列表单选,多选音视频标签 CSS篇伪元素清楚浮动固定定位fixedemCSS三角 JS细节篇原型链字符串拼接的方法递归 JS内置对象sort的升序和降序字符串大写和小写Objects对象的方法date的用法数字取整数组的最大值与最小值 We…

ROS中使用VLP16激光雷达获取点云数据

ROS中使用VLP16激光雷达获取点云数据 个人博客地址 本文测试环境为:Ubuntu20.04 ROS Noetic 需要将激光雷达与PC连接,然后在设置>网络>有线中将IPv4改为手动,并且地址为192.168.1.100,子网掩码为255.255.255.0&#xff0c…

leetcode61. 旋转链表(java)

旋转链表 leetcode61. 旋转链表题目描述 解题思路代码演示链表专题 leetcode61. 旋转链表 Leetcode链接: https://leetcode.cn/problems/rotate-list/ 题目描述 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 示例…

浅析 xml 数据格式文件

浅析 xml 数据格式文件 xml ( Extensible Markup Language ) 全称 -> 可拓展的标记语言; xml文件的主要用途:xml文件主要用于数据的 传输 和 存储,并不是展示; xml标签与html的区别:节点的标签使用方式和 html 十分…

【产品经理】企业的产品增长之路

英特尔前CEO安迪格鲁夫有本书叫做《Only the Paranoid Survive》,全文的中心思想是警示他人,要居安思危,唯有打破常规,不拘泥于现状才能生存。 一、为何企业都在关注增长? 1. 诺基亚的贱卖 13年市值曾位居全球上市公…

HNU-操作系统OS-作业1(4-9章)

这份文件是OS_homework_1 by计科2102 wolf 202108010XXX 文档设置了目录,可以通过目录快速跳转至答案部分。 第四章 4.1用以下标志运行程序:./process-run.py -l 5:100,5:100。CPU 利用率(CPU 使用时间的百分比)应该是多少?为什么你知道这一点?利用 -c 标记查看你…

Spring中如何获取Bean方法上的自定义注解

文章目录 背景描述场景复现问题追踪解决方案扩展思考 背景描述 项目中需要扫描出来所有 标注了自定义注解A的Service里面标注了自定义注解B的方法 来做后续处理。 基本的思路就是通过Spring提供的ApplicationContext#getBeansWithAnnotation反射 来实现。 但是,随…