Nacos与Eureka中的高性能读写并发架构设计

news2024/9/21 23:04:01

Nacos、Eureka都是微服务领域内熟知、常用的注册中心组件。只不过呢,Nacos还多了个功能身份就是配置中心。从目前流行与随着Spring Cloud Alibaba发展来看,Nacos使用得更加多,也是趋势所在。

注册中心原理

注册中心原理其实很简单,基本思想都是差不多的。就是生产者客户端在启动时,将当前服务实例信息封装上报给服务端。服务端进行解析处理存起来。这里的存储可以是在内存存储,也可以持久化存储(文件、数据库都行)。生产者与服务端维持心跳,达到服务健康状态检查。最后消费者客户端从服务端拉取服务信息。从而达到服务的注册与发现效果。网络通信这块可以用netty 也可以用http来做。最好netty性能会更加好些。

一个好的注册中心必须要有很好的读写并发性能,不然在成千上万的服务,再加之服务集群部署时,注册中心怎么扛得住?

读写并发问题

注册中心的注册表的服务实例信息,会随着生产者的改变发生操作,而消费者会从注册中心拉取注册表信息,这是操作。当读写同时进行时,就会产生读写并发问题了。常见的解决方案有:

  • 加悲观锁同步。这种性能太差了,不推荐。如果加锁粒度比较小,还能凑合下。
  • 加读写锁。这种性能是比上一种方案好,但是一旦需要扯上锁,永远快不到哪里去。
  • COW 写时复制。这个技术不错,没有锁介入。写时复制一份副本出来操作,读操作还是操作原始数据。Redis的在bgsave 主从数据复制时,主实例继续接受处理指令,而数据又能同时复制传输,用到的技术就是这个COW写时复制。

接下来我们细细了解Nacos与Eureka的在架构设计是如何提高其读写并发性能的

Nacos读写并发架构设计

Nacos客户端在向服务端注册时,将注册信息封装成instance对象,服务端接受后,存入一个内部阻塞队列,就返回成功响应给客户端完成注册了。这样可以极大提高客户端的注册速度以及启动速度,不会对客户端所属服务带来影响。

Nacos服务端起了一个只有一个线程的线程池定时调度执行一个任务,那就是异步从阻塞队列里拉取注册信息进行处理,完成注册信息的注册。在注册时,是利用COW写时复制,拷贝一个副本出来进行写处理,之后再回写回原注册表,来提高读写并发性能。

还有一个亮点就是 ,我们都知道 这么多服务集群实例,肯定会存在多个同时写并发问题,难道一个实例要完成写入注册,就COW拷贝一份,那这么多实例节点,Nacos服务端怎么能够扛得住呢?

显然Nacos设计者考虑到了这一点,阿里中间件设计有这么一句话,解决问题的最好办法不是去解决他,而是规避他。所以Nacos在实现上,并没有去花精力在怎么解决同时写并发问题,而是选择了直接一个线程池里只有一个线程去解决处理。这样单个线程从阻塞队列里拉取一个处理一个。因为都是基于内存操作,这个处理速度是相当快的。所以不用担心一个线程消费能不能跟得上的问题。

但是这样设计也不是十全十美,会存在一个问题 :虽然提高了Nacos注册表读写性能,但是也带来客户端(消费者)拉取到的注册表信息不是最实时或者说不是最新的。但是由于客户端会定时向Nacos拉取注册表信息,可以解决这个问题。顶多就是服务没那么及时被发现,并不影响整个系统的可用性。

Nacos原理

Eureka读写并发架构设计

Eureka读写并发架构设计比较简单暴力,它是利用多级缓存来提高读写并发性能的。Eureka里的服务注册表发生变更时,同步readwrite缓存时,不是做相应条目的变更更新,而是直接把readwrite缓存清空。这点跟我们平时做业务缓存架构比较像,不去比较条目变更更新,而是直接清空它这个缓存。这样后台线程判断比较readwrite缓存与readonly缓存不一致时,就会同步更新空的给readonly缓存。这样客户端拉取时,发现readonly缓存也为空,就会从服务注册表拉取内容,再填充给这两个缓存。

但是带来的弊端也是比较明显,那就是Eureka一直被吐槽的 服务发现太慢,太不及时了!检查同步都是30秒级别,三个一加就得1分半钟。所以Eureka部署时必须得调优,调低检查时间。但是调太低了 又会导致线程检查过于频繁,浪费CPU。要是注册表没啥变动情况下,就是“徒劳”在那里检查个寂寞。

在这里插入图片描述

好了 ,本文也要结束啦~ Nacos与Eureka读写并发设计上,都是抛弃了锁来实现的。两者各有千秋,都是优秀的,都是值得我们学习的架构思想。

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

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

相关文章

【18】Java常见的面试题汇总(Spring/Spring MVC)

目录 1. 为什么要使用 spring? 2. 解释一下什么是 aop? 3. 解释一下什么是 ioc? 4. spring 有哪些主要模块? 5. spring 常用的注入方式有哪些? 6. spring 中的 bean 是线程安全的吗? 7. spring 支持…

【Java八股文总结】之外卖平台项目整理

文章目录一、项目介绍1.1 项目整体介绍1.2 主要模块介绍二、项目开发2.1 后台管理系统开发2.1.1 员工管理employee1、员工后台登录2、员工退出3、过滤器4、新增员工5、员工信息分页查询↑(参加上面)6、修改员工信息7、根据id查询员工信息,回显…

后台开发的学习日记

后台开发的学习日记 Java后台开发的日记:Push一下自己每天都要学习后台 后台开发学习日志-Day1后台开发的学习日记Day1: 路线及资料的汇总一、应该选择什么语言?二、学习路线的规划及资料的汇总整理Day1: 路线及资料的汇总 第一天主要是路线的准备及资料…

Pytorch学习笔记(二)官方60min入门教程之自动微分

目录 一.相关包及函数介绍 二.雅各比向量积 三.练习代码 一.相关包及函数介绍 autograd 包是 PyTorch 中所有神经网络的核心。首先让我们简要地介绍它,然后我们将会去训练我们的第一个神经网络。该 autograd 软件包为 Tensors 上的所有操作提供自动微分。它是一…

显卡天梯图2022年11月新版 显卡性能排行榜天梯图

1 RTX 3090Ti 2 RTX 3090 3 RX 6900 XT水冷版 我用的显卡就是活动时8折抢购的太划算了 http://www.adiannao.cn/dq 4 RTX 3080 Ti 5 RX 6900 XT 6 Titan RTX 7 RTX 3080 8 RX 6800 XT 9 RX 6800 10 RTX 3070 Ti

C++数据结构X篇_01_数据结构的基本概念

从本篇开始学习数据结构相关概念。 数据结构的基本概念1 数据结构的相关概念1.1 为什么要学习数据结构1.2 数据结构中的基本概念2 算法2.1 算法的概念2.2 算法和数据结构的区别2.3 算法特性2.4 算法效率的度量2.4.1 事后统计法2.4.2 事前分析估算2.4.3 大O表示法2.4.3.1采用大O…

从事先进计算的工程师对此都有什么感想?

电子计算机最初诞生于二十世纪,体积庞大的初代机型运算能力有限,随着计算技术的升级完善,现在多样小巧的计算机及手机的计算能力呈指数级增长,更是成为人们生活密不可分的综合性助手。 先进计算是在计算的基础上诞生的全新概念&a…

Python3安装及基础语法

Python 官网:Welcome to Python.org Python安装:进入官网Download找到对应版本安装包,下载后双击安装,一直下一步即可;注意:安装最后一步勾选(Add Python to PATH),默认…

用nginx作反向代理时,请求头中含波浪线无法转发请求的解决方法

请求头如下 POST /CDGServer3/s/rs/uni HTTP/1.1 Content-Type: text/html; charsetUTF-8 method~name: upgradePatchService user~userId: admin.local user~clientId: 343834353230344334424431 user~SessionID: 0 data~packageNo: 618 data~packageState: 1 User-Agent: Ra…

Android -- 每日一问:怎么理解 Activity 的生命周期?

典型回答 如果一个 Activity 在用户可见时才处理某个广播,不可见时注销掉,那么应该在哪两个生命周期的回调方法去注册和注销 BroadcastReceiver 呢? Activity 的可见生命周期发生在 onStart调用与 onStop调用之间。在这段时间,用户…

nginx(六十四)proxy模块(五)接收上游响应

一 接收上游的响应 前提: nginx与上游建立连接,把nginx生成的请求(line、header、body)信息发送给上游补充: 上游解析处理完之后,会发送响应​核心: nginx如何接收、解析、处理上游响应行、响应头、响应体 下载大文件失败 (…

一文了解 Go 的复合数据类型(数组、Slice 切片、Map)

一文了解 Go 的复合数据类型[数组、切片 Slice、Map]前言数组数组的创建方式数组的遍历Slice 切片切片的创建方式切片的遍历向切片追加元素MapMap 的创建方式Map 的基本操作插入和修改删除查找操作遍历操作删除操作小结耐心和持久胜过激烈和狂热。 前言 上一篇文章一文熟悉 Go…

CMake Cookbook by Eric

I. Basics 关键字&#xff1a;CMake中的构建指令 指令的书写是大小写无关的&#xff1b; II. Project&#xff1a;指定项目名称和语言类型 命令格式&#xff1a;project(<PROJECT-NAME> [<language-name>...]) Note 项目名称<PROJECT-NAME>不需要与项目根…

论文阅读【7】HHM隐马尔科夫模型

1.隐马尔科夫模型&#xff08;HMM&#xff09;的介绍 隐马尔科夫模型有两个序列&#xff0c;上面一层序列的值称之为影藏值(隐式变量)&#xff0c;下面一个序列中的值被称为观察值&#xff0c;想这个的序列模型被称为生成模型&#xff08;Generate model&#xff09;。z表示的是…

Linux - lsof显示 tcp,udp 的端口和进程

文章目录功能语法示例lsof -i 显示 tcp&#xff0c;udp 的端口和进程等相关查看服务器 80 端口的占用情况使用 -p 查看指定进程打开的文件更多命令功能 lsof&#xff08;list open files&#xff09;是一个列出当前系统打开文件的工具。 lsof 需要访问核心内存和各种文件&…

【区块链技术与应用】(八)

https://blog.csdn.net/lakersssss24/article/details/125762826?spm1001.2014.3001.5501 https://blog.csdn.net/lakersssss24/article/details/126434147 https://blog.csdn.net/lakersssss24/article/details/126671408?spm1001.2101.3001.6650.3&utm_mediumdistribut…

[附源码]java毕业设计医院仪器设备管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

cubeIDE开发, stm32的OLED点亮及字符显示设计(基于SPI通信)

一、SPI 通信技术 显示屏&#xff08;LCD、OLED&#xff09;接口一般有I2C、SPI、UART、RGB、LVDS、MIPI、EDP和DP等。一般3.5寸以下的小尺寸LCD屏&#xff0c;显示数据量比较少&#xff0c;普遍采用低速串口&#xff0c;如I2C、SPI、UART。SPI&#xff08;Serial Peripheral I…

通用后台管理系统前端界面Ⅹ——前端数据表格的删除、查找

删除操作 1、拿到id或者行数据对象 2、查看后端接口方法&#xff0c;写api方法&#xff0c;将操作连接上后端 后端请求操作成功&#xff0c;但是前端数据表格未更新&#xff0c;最简单的一种方法数据删除后要重新获取数据》 依旧显示成功&#xff0c;但是前端数据表格未变化&…

Bert and its family

Bert没有办法一次性读入特别长的文本的问题。自注意力机制非常消耗时间和空间。 概率值最大取argmax&#xff0c;对应的下标 整体全部更新&#xff0c;所有参数都更新&#xff0c;比固定住pre-trained要好很多。 不做预训练&#xff0c;loss下降比较慢&#xff0c;收敛比较慢&a…