您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

什么是读写锁?微服务注册中心是如何进行读写锁优化的?

时间:2019-11-14 10:38:12  来源:  作者:

本文转载自公众号:石杉的架构笔记

作者:中华石杉,十余年BAT架构经验倾囊相授。个人微信公众号:石杉的架构笔记(ID:shishan100)

一、读写锁的介绍

本文我们来聊一下读写锁。所谓的读写锁,就是将一个锁拆分为读锁和写锁两个锁,然后加锁的时候,可以加写锁,也可以加读锁。

如下面代码所示:

什么是读写锁?微服务注册中心是如何进行读写锁优化的?

 

如果有一个线程加了写锁,那么其他线程就不能加写锁了,同一时间只能允许一个线程加写锁

因为加了写锁就意味着有人要写一个共享数据,那同时就不能让其他人来写这个数据了。

如果有线程加了写锁,其他线程就不能加读锁了,因为既然都有人在写数据了,你其他人当然不能来读数据了!

如果有一个线程加了读锁,别的线程是可以同时加读锁的,因为只是有线程在读数据而已,此时别的线程也是可以来读数据的!

同理,如果一个线程加了读锁,此时其他线程是不可以加写锁的,因为既然有人在读数据,那就不能让你随意来写数据了!

好了!这个就是初步介绍一下读写锁的使用方法,相信很多同学应该之前都知道了,因为这个是JAVA开发中非常基础的一块知识。

二、微服务注册中心的读写锁优化

现在进入主题,我们主要聊一下微服务注册中心里面的读写锁优化。

为什么要聊这个问题?

因为如果你出去面试,很可能被问到读写锁的问题,此时你可以自然的带出来,你之前了解过Spring Cloud微服务技术架构,同时对里面的微服务注册中心的注册表读写锁优化有一些自己的感悟和看法。

这样的话,相比于你简单的给面试官聊聊读写锁的基本概念和使用方法,要增色不少!

首先,大家需要了解一点微服务的整体架构知识,可以参考之前写过的一篇文章拜托,面试请不要再问我Spring Cloud底层原理!。

同时还需要了解一下Spring Cloud Eureka(即微服务注册中心)的核心原理。

这个可以参考之前写过的一篇文章【双11狂欢的背后】微服务注册中心是如何承载大型系统千万级访问的

了解了这些前置知识之后,我们正式开始。

先来看看下面的图,现在我们知道一个微服务注册中心(可以是Eureka或者Consul或者你自己写的一个微服务注册中心)肯定会在内存中有一个服务注册表的概念。

这个服务注册表中存放了各个微服务注册时发送过来的自己的地址信息,里面保存了每个服务有多少个服务实例,每个服务实例部署在哪台机器上监听哪个端口号,主要是这样的一些信息,如下图所示:

什么是读写锁?微服务注册中心是如何进行读写锁优化的?

 

那现在问题来了,这个服务注册表的数据,其实是有人读也有人写的,对不对?

举个例子,比如有的服务启动的时候会来注册,此时就会修改服务注册表的数据,这个就是写的过程。

接着,别的服务也会来读这个服务注册表的数据,因为每个服务都需要感知到其他服务在哪些机器上部署。

所以,这个内存里的服务注册表数据,天然就是有读写并发问题的!可能会有多个线程来写,也可能会有多个线程来读!

如果你对同一份内存中的注册表数据不加任何保护措施,那么可能会有多线程并发修改共享数据的问题,可能导致数据错乱,对吧?

上述过程,大家看看下面的图,就明白了。

什么是读写锁?微服务注册中心是如何进行读写锁优化的?

 

此时你可能会想,如果对服务注册表的服务注册和读取服务注册表的方法,都加一个synchronized关键字,不就可以了?

你也许会说,加上synchronized,直接让所有线程对服务注册表的读写操作,全部串行化。那不就可以保证内存中的服务注册表数据安全了吗?

下面是一段伪代码,大家来感受一下:

什么是读写锁?微服务注册中心是如何进行读写锁优化的?

 

在上面的代码中直接给写(服务注册)读(读取服务注册表)两个方法,都暴力的加上了synchronized关键字,确实是可以保证服务注册表的数据不错乱,但是这样肯定是不太合适的。

因为这么搞的话,相当于是所有的线程读写服务注册表数据,全部串行化了。

大家读到这里,先暂停一下,思考思考我们想要的效果是什么?

其实不就是在有人往服务注册表里写数据的时候,就不让其他人写了,同时也不让其他人读!

然后,有人在读服务注册表的数据的时候,其他人都可以随便同时读,但是此时不允许别人写服务注册表数据了!

对吧,我们想要的,其实不就是这个效果吗?

想清楚了这点,我们就不应该暴力的加一个synchronized,让所有读写线程全部串行化,因为那样会导致并发性非常的低。

大家看看下面的图,我们想要的第一个效果:一旦有人在写服务注册表数据,我们加个写锁,此时别人不能写,也不能读。

什么是读写锁?微服务注册中心是如何进行读写锁优化的?

 

如果有人在读数据呢?此时就可以让别人都可以读,但是不允许任何人写。

大家看下面的图:

什么是读写锁?微服务注册中心是如何进行读写锁优化的?

 

关键点来了,这样做有什么好处呢?

其实大部分时候都是读操作,所以使用读锁可以让大量的线程同时来读数据,不需要阻塞不需要排队,保证高并发读的性能是比较高的。

然后少量的时候是有服务上线要注册数据,写数据的场景是比较少的

此时写数据的时候,只能一个一个的加写锁然后写数据,同时写数据的时候就不允许别人来读数据了。

因此读写锁非常适合这种读多写少的场景的。

另外,我们能不能尽量在写数据期间还保证可以继续读数据呢?大量加读锁的时候,会阻塞人家写数据加写锁过长时间,这种情况能否避免呢?

可以的,采用多级缓存的机制,具体可以参加之前的一篇文章:【双11狂欢的背后】微服务注册中心是如何承载大型系统千万级访问的》。里面分析了Spring Cloud Eureka微服务注册中心里的多级缓存机制。

最后看一下,上面那段伪代码如果用读写锁来优化是怎么样的?

什么是读写锁?微服务注册中心是如何进行读写锁优化的?

 



Tags:读写锁   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
x一、互斥锁(同步)  在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源。这个过程有点类似于,公司部门里,我在使用着打印机打印东西的同时(还没有打印完),...【详细内容】
2020-07-17  Tags: 读写锁  点击:(73)  评论:(0)  加入收藏
简述Golang中的锁机制主要包含互斥锁和读写锁互斥锁互斥锁是传统并发程序对共享资源进行控制访问的主要手段。在Go中主要使用 sync.Mutex的结构体表示。一个简单的示例:func...【详细内容】
2019-12-03  Tags: 读写锁  点击:(62)  评论:(0)  加入收藏
本文我们来聊一下读写锁。所谓的读写锁,就是将一个锁拆分为读锁和写锁两个锁,然后加锁的时候,可以加写锁,也可以加读锁。...【详细内容】
2019-11-14  Tags: 读写锁  点击:(80)  评论:(0)  加入收藏
相交进程之间的关系主要有两种,同步与互斥。所谓互斥,是指散步在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它 们之中的任一程序片段,只...【详细内容】
2019-08-05  Tags: 读写锁  点击:(237)  评论:(0)  加入收藏
▌简易百科推荐
为了构建高并发、高可用的系统架构,压测、容量预估必不可少,在发现系统瓶颈后,需要有针对性地扩容、优化。结合楼主的经验和知识,本文做一个简单的总结,欢迎探讨。1、QPS保障目标...【详细内容】
2021-12-27  大数据架构师    Tags:架构   点击:(5)  评论:(0)  加入收藏
前言 单片机开发中,我们往往首先接触裸机系统,然后到RTOS,那么它们的软件架构是什么?这是我们开发人员必须认真考虑的问题。在实际项目中,首先选择软件架构是非常重要的,接下来我...【详细内容】
2021-12-23  正点原子原子哥    Tags:架构   点击:(7)  评论:(0)  加入收藏
现有数据架构难以支撑现代化应用的实现。 随着云计算产业的快速崛起,带动着各行各业开始自己的基于云的业务创新和信息架构现代化,云计算的可靠性、灵活性、按需计费的高性价...【详细内容】
2021-12-22    CSDN  Tags:数据架构   点击:(10)  评论:(0)  加入收藏
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  蜗牛学苑    Tags:微服务   点击:(9)  评论:(0)  加入收藏
我是一名程序员关注我们吧,我们会多多分享技术和资源。进来的朋友,可以多了解下青锋的产品,已开源多个产品的架构版本。Thymeleaf版(开源)1、采用技术: springboot、layui、Thymel...【详细内容】
2021-12-14  青锋爱编程    Tags:后台架构   点击:(21)  评论:(0)  加入收藏
在了解连接池之前,我们需要对长、短链接建立初步认识。我们都知道,网络通信大部分都是基于TCP/IP协议,数据传输之前,双方通过“三次握手”建立连接,当数据传输完成之后,又通过“四次挥手”释放连接,以下是“三次握手”与“四...【详细内容】
2021-12-14  架构即人生    Tags:连接池   点击:(17)  评论:(0)  加入收藏
随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商...【详细内容】
2021-12-08  架构驿站    Tags:分布式系统   点击:(23)  评论:(0)  加入收藏
本系列为 Netty 学习笔记,本篇介绍总结Java NIO 网络编程。Netty 作为一个异步的、事件驱动的网络应用程序框架,也是基于NIO的客户、服务器端的编程框架。其对 Java NIO 底层...【详细内容】
2021-12-07  大数据架构师    Tags:Netty   点击:(17)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  人月聊IT    Tags:架构   点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  GreekDataGuy  CSDN  Tags:单体应用   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条