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

news2024/12/21 13:55:01

文章目录

      • 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.coloradmin.cn/o/2185104.html

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

相关文章

链表OJ经典题目及思路总结(二)头结点

系列文章目录 链表OJ经典题目及思路总结(一)双指针 链表OJ经典题目及思路总结(二)头结点 文章目录 系列文章目录前言1.建立新链表1.1 移除链表元素 2.哨兵位的头结点2.1 链表分割2.2 合并两个有序链表 3.CV工程师总结 前言 对于…

Python笔记 - 利用装饰器设计注解体系

认识注解 注解(Annotation)是一种用于为代码添加元数据的机制。这些元数据可以在运行时被访问,用于为代码元素(如类、方法、字段等)提供额外的信息或指示。 由于Python中装饰器只能装饰类和方法,因此也只…

C动态内存管理

前言:不知不觉又过去了很长的一段时间。今天对C语言中的动态内存管理进行一个系统性的总结。 1 为什么要有动态内存分配 在C语言中,使用int,float,double,short等数据内置类型以及数组不是也可以开辟内存空间吗&…

《算法岗面试宝典》重磅发布!

大家好,历时半年完善,《算法岗面试宝典》 终于可以跟大家见面了。 最近 ChatGPT 爆火,推动了技术圈对大模型算法场景落地的热情,就业市场招聘人数越来越多,算法岗一跃成为竞争难度第一的岗位。 岗位方向 从细分方向…

李宏毅深度学习-梯度下降和Normalization归一化

Gradient Descent梯度下降 ▽ -> 梯度gradient -> vector向量 -> 下图中的红色箭头(loss等高线的法线方向) Tip1: Tuning your learning rates Adaptive Learning Rates自适应 通常lr会越来越小 Adaptive Learning Rates中每个参数都给它不同…

110.WEB渗透测试-信息收集-ARL(1)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:109.WEB渗透测试-信息收集-FOFA语法(9) 信息收集自动化工具-灯塔…

黑马头条day6-kafka及异步通知文章上下架

今天任务比较水 主要是kafka入门和 文章上下架 以及异步通知article同步到app的前端数据 需要重新看一下(使用步骤并不是很复杂 kafka主要解决高并发) 1 kafka的入门 和 使用异步 需要重新看一下了流程和 详细信息 2 bug 打开app页面的时候出现503 服…

从0到1深入浅出构建Nest.Js项目

Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用JavaScript 的渐进增强的能力,使用并完全支持 TypeScript (仍然允许开发者使用纯 JavaScript 进行开发),并结合了 OOP (面向对…

动手学运动规划: 2.2.c 3次样条曲线代码解析

学习? 学个P!☺ — 亮剑 李云龙 🏰代码及环境配置:请参考 环境配置和代码运行! 本节提供了3次样条曲线的代码测试 python3 tests/curves/cubic_spline.py2.2.c.1 3次样条曲线代码实现 CubicSpline1D实现了1维的3次样条曲线, 需要输入一组离散点. Cub…

现在别买理想L7/L8,问界M8要来暴揍友商了

文 | AUTO芯球 作者 | 雷慢 问界又一重磅炸弹要来了, 它就是问界M8, 来看,M8刚又曝光了大量谍照。 现在我打听的消息是这样的, 11月广州车展亮相预售, 12月底正式上市,25年春节前后开始交付&#xff…

计算机网络:计算机网络体系结构 —— 专用术语总结

文章目录 专用术语实体协议服务服务访问点 SAP 服务原语 SP 协议数据单元 PDU服务数据单元 SDU 专用术语 实体 实体是指任何可以发送或接收信息的硬件或软件进程 对等实体是指通信双方处于相同层次中的实体,如通信双方应用层的浏览器进程和 Web 服务器进程。 协…

Java组件化开发:jar包

我在java基础:原始数据类型,包的创建与导入-CSDN博客一文中记录了包的使用,此文就详细讲解一下IDEA中如何进行组件化开发。 介绍 现在的软件系统功能越来越复杂,规模也越来越大,为了应对这种挑战,人们将“…

深入解析Python错误消息及解决方法

深入解析Python错误消息及解决方法 Python是开发者广泛使用的语言,因其简洁的语法和强大的标准库而深受欢迎。然而,Python程序在运行过程中,错误不可避免。理解Python的错误消息并正确处理这些错误,是提升代码质量和调试效率的重…

3.点位管理改造-列表查询——帝可得管理系统

目录 前言一、与页面原型差距1.现在:2.目标:3. 存在问题:所在区域和合作商ID展示的都是ID,而不是名称;同时合作商ID应改为合作商 二、修改1.重新设计SQL语句2.修改mapper层,使用Mybatis中的嵌套查询3.修改s…

AI人工智能人像修饰中文面板PS插件 Retouch Pro 3.2.0 中文汉化版

AI人工智能人像修饰PS扩展插件 Retouch Pro 3.2.0 中文汉化版 支持软件:PS 2018 – PS 2025或更高版本 系统要求:Windows系统 或 MacOS系统 出处:https://www.aeown.com/thread-3061-1-1.html Retouch Pro Panel 有一个非常强大和先进的人工…

Python Tips6 基于数据库和钉钉机器人的通知

说明 起因是我第一版quant程序的短信通知失效了。最初认为短信是比较即时且比较醒目的通知方式,现在看来完全不行。 列举三个主要问题: 1 延时。在早先还能收到消息的时候,迟滞就很严重,几分钟都算短的。2 完全丢失。我手机没有…

ACP科普:SoSM和CPO

在Scrum of Scrums(SoS)框架中,SoSM(Scrum of Scrums Master)和CPO(Chief Product Owner)是两个关键角色,负责协调多个Scrum团队的工作,确保项目的顺利进行。以下是对这两…

Android AMS介绍

注:本文为作者学习笔记,如有误,请各位大佬指点 系统进程运行环境的初始化 Context是一个抽象类,它可以访问application环境的全局信息和各种资源信息和类 context功能: 对Activity、Service生命周期的管理通过Intent发…

c++进阶之多态讲解

这篇文章和大家一起学习一下c中的多态 多态的概念 多态的概念:通俗来讲,就是多种形态。多态分为编译时多态(静态多态)和运⾏时多态(动态多态)。 什么是静态多态 前⾯讲的函数重载和函数模板,它们传不同类型的参数就可以调用不同的函数&…

深入理解 C 语言中的内存操作函数:memcpy、memmove、memset 和 memcmp

目录: 前言一、 memcpy 函数二、 memmove 函数三、 memset 函数四、 memcmp 函数总结 前言 在 C 语言中,内存操作函数是非常重要的工具,它们允许我们对内存进行直接操作,从而实现高效的数据处理。本文将深入探讨四个常用的内存操…