Nacos架构与原理 - 通信通道

文章目录

  • 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.hqwc.cn/news/9306.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NSS [SWPUCTF 2021 新生赛]no_wakeup

NSS [SWPUCTF 2021 新生赛]no_wakeup 先看题目&#xff0c;反序列化&#xff0c;绕过weakup。 exp&#xff1a; <?php class HaHaHa{public $admin;public $passwd;public function __construct(){$this->admin "admin";$this->passwd "wllm";…

HttpRunner接口自动化测试框架详解

目录 简介 框架流程 核心特性 下载安装 入门使用 测试场景 用例设计 运行测试 查看测试报告 HttpRunnerManager 简介 核心特性 下载安装 环境配置 erlang Rabbitmq 总结&#xff1a; 简介 HttpRunner是一款面向 HTTP(S) 协议的通用测试框架&#xff0c;只需编…

JavaScript

目录 一、javaScript介绍 二、JavaScript使用 三、变量 四、关系比较运算 五、逻辑运算 五、数组 六、函数 1.函数的定义方式 2.函数的作用域 3.变量声明提前 4.this关键字 七、自定义对象 1.Object 对象 2.自定义对象 3.匿名函数 比较数据 八、js中的事件 1.事件定义 …

蘑菇车联用城市级落地讲述自动驾驶新故事

作者 | 魏启扬 来源 | 洞见新研社 “如果不能实现自动驾驶&#xff0c;特斯拉将一文不值”。 这是马斯克在接受媒体采访时的公开发言&#xff0c;这句话的语境是&#xff0c;特斯拉是自动驾驶坚实的拥护者&#xff0c;且一直在付诸行动。 可是特斯拉渐进式的单车智能路线&am…

CodeTop整理-数组篇

目录 53. 最大子序和 33. 搜索旋转排序数组 三数之和 121. 买卖股票的最佳时机 4. 寻找两个正序数组的中位数 695. 岛屿的最大面积 54. 螺旋矩阵 88. 合并两个有序数组 152. 乘积最大子数组 42. 接雨水 64. 最小路径和 1. 两数之和 123. 买卖股票的最佳时机 III …

Ubuntu 22.04.2 LTS LTS x86_64 安装 stable-diffusion-webui 【2】基本版本完结。

前篇 Ubuntu 20.04 LTS x86_64 安装 stable-diffusion-webui_hkNaruto的博客-CSDN博客 内容太多&#xff0c;分第二篇继续 中途重装了机器&#xff0c;20.04 &#xff0c;apt upgrade后自动升级到22.04.2 现状&#xff1a;起来了&#xff0c;又没完全起来 启动日志 (stab…

mysqldump + python 定时备份数据库

场景&#xff1a; 需要对mysql进行定时备份&#xff0c;受限于硬盘空间的大小&#xff0c;需要对备份的数据需要定时清理 python代码实现&#xff1a; # -*- coding:UTF-8 -*- """ProjectName : HotelGo2DelonixPmxFileName : fix_missing_ratesDescripti…

基本 SQL 命令 、重要的 SQL命令、SQL 约束 及 SQL语句 的 执行顺序

学习目标&#xff1a; 学习目标如下&#xff1a; SQL语句执行顺序 学习内容&#xff1a; 基本 SQL 命令&#xff1a; FROMONJOINWHEREGROUP BYAGG_FUNCWITHHAVINGSELECT 从数据库中提取数据UNIONDISTINCTORDER BY 排序LIMIT 重要的sql命令&#xff1a; 1、SELECT - 从数据…

Linux:etc/group

etc/group文件中保存着系统中所有组的名称&#xff0c;以及每个组中的成员列表。 文件中的一行为一个组的信息&#xff0c;具体如下&#xff1a; 如果组口令字段为x的话&#xff0c;就还有一个etc/gshadow文件用于存放组口令。 GID用于标识一个组&#xff0c;应保证其唯一性。…

使用 ZBrush、Ornatrix 和 Substance 3D Painter 重现哈利波特中的凤凰

今天瑞云渲染小编给大家带来了Ramn Tapia 分享 Phoenix 项目背后的工作流程&#xff0c;解释了如何在 Ornatrix 中完成修饰&#xff0c;并展示了纹理化过程。 介绍 你好&#xff0c;有创造力的读者朋友们 我的名字是Ramn&#xff0c;但在数字艺术领域&#xff0c;我的名字是ra…

使用fiddler和jmeter进行简单的接口测试。

初学接口测试&#xff0c;以下内容是记录首次使用fiddler和jmeter进行接口测试的步骤&#xff0c;可能步骤有点繁琐&#xff0c;如果有不对的地方&#xff0c;欢迎大家指正。 准备活动&#xff1a; 1、打开fiddler&#xff0c;打开fiddler以后会自动开启代理服务器&#xff08…

89C52RC普中单片机-3

1.LCD1602调试工具 main.c #include<regx52.h> #include "lcd1602.h" void main() {lcd1602_init();//LCD1602初始化();while(1){lcd1602_show_string(0,0,"helloworld");lcd1602_show_string(1,1,"123456.0");} } lcd1602.c #include …