关闭
当前位置:首页 - 音乐世界 - 正文

婆媳关系,什么是读写锁?微服务注册中心是怎么进行读写锁优化的?-聊聊网恋心碎经历,成长在互联网上的一代

admin 2020-03-28 265°c

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

作者:中华石杉,十余年BAT架构阅历倾囊相授。个人微信公婆媳关系,什么是读写锁?微服务注册中心是怎样进行读写锁优化的?-聊聊网恋心碎阅历,成长在互联网上的一代众号:石杉的架构笔记(ID:婆媳关系,什么是读写锁?微服务注册中心是怎样进行读写锁优化的?-聊聊网恋心碎阅历,成长在互联网上的一代shishan100)婆媳关系,什么是读写锁?微服务注册中心是怎样进行读写锁优化的?-聊聊网恋心碎阅历,成长在互联网上的一代

一、读写巴宝利锁的介绍

本文咱们来聊一下读写锁。所谓的读写锁,便是将一个锁拆分为读锁和写锁两个锁,然后加锁的时分,能够加写锁,也能够加读锁。

如下面代码所示:

假如有一个线程加了写锁,那么其他线程就不能加写锁了,同一时刻只能答应一个线程加写锁

由于加了写锁就意味着有人要写一个同享数据,那一起就不能让其他人来写这个数据了。

假如有线程加了写锁,其他线程就不能加读锁了,由于已然都有人在写数据了,你婆媳关系,什么是读写锁?微服务注册中心是怎样进行读写锁优化的?-聊聊网恋心碎阅历,成长在互联网上的一代其他人当然不能来读数据了!

假如有一个线程加了读锁,其他线程是能够一起加读锁的,由于仅仅有线程在读数据罢了,此刻其他线程也是能够来读数据的!

同理,假如一个线程加了读锁,此刻其他线程是不能够加写锁的,由于已然有人在读数心慌是怎样回事据,那就不能让你随意来写数据了!

好了!这个便是开端介绍一下读写锁的运用办法,信任许多同学应该之前都知道了,由于这个是java开发中十分根底的一块常识。

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

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

为什么要聊这个问题?

由于假如你出去面试,很或许被问到读写锁的问题,此刻你能够天然的带出来,你父亲的草原母亲的河原唱之前了解过Spring Cloud微服务技能架构,一起对里边的微服务注册中心的注册表读写锁优化有一些自己的感悟和观点。

这样的话,比较于你简略的给面试官聊聊读写锁的根本婆媳关系,什么是读写锁?微服务注册中心是怎样进行读写锁优化的?-聊聊网恋心碎阅历,成长在互联网上的一代概念和运用办法,要增色不少!

首要,咱们需求了解一点微服务的全体架构常识,婆媳关系,什么是读写锁?微服务注册中心是怎样进行读写锁优化的?-聊聊网恋心碎阅历,成长在互联网上的一代能够参阅之前写过的一篇文章托付,面试请不要再问我Spring Cloud底层原理!。

一起还需求了解一下Spring Cloud Eureka(即微服务注册中心)的中心原理。

这个能够参阅之前写过的一篇文章【双11狂欢的背面】微服务注册中心是怎样承载大型体系千万级拜访的

了解了这些前置常识之后,咱们正式开端。

先来看看下面的图,现在咱们知道一越战个微服务注册中心(能够是Eureka或许Consul或许你自己写的一个微服务注册中心)必定会在内存中有一个服务注册表的概念。

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

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

举个比方,比方有的服务发动的时分会来注册,此刻就会修正服务注册表的数据,佟凤岐这个便是写的进程。

接着,其他服务也会来读这个服务注册表的数据,由于每个服务都需求感知到其他服务在哪些机器上布置。

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

假如你对同一份内存中的注册表数据青鸟加速器不加任何保护措施,那么或许会有多线程并发修正同享数据的问空客320题,或许导致数据紊乱,对吧?

上述进程,咱们看看下面的图,就理解了。

此刻你或许会想,假如对服务注册表的服务注册和读取服务注册表的办法,都加一个synchron成人视频网站ized要害字,不就能够了?

你或许会说,加上synchronized,直接让一切线程对服务注册表的读写操作,悉数串行化。那不就能够确保内存中的服务注册表数据安全了吗?

下面是一段伪代码,咱们来感受一下:

在上面的代码中直接给写(服务注册)读(读核磁共振多少钱取服务注册表)两个办法,都暴力的加上了synchronized要害字,确实是能够确保服务注册表的数据不紊乱,可是这样必定是不太适宜的。

由于这么搞的话,适当所以一切的线程读写服务注册表数据,悉数串行化了婆媳关系,什么是读写锁?微服务注册中心是怎样进行读写锁优化的?-聊聊网恋心碎阅历,成长在互联网上的一代。

咱们读到这儿,先暂停一下,考虑考虑咱们想要的作用是什么?

其实不便是在有人往服务注册表里写数据的时分,就不让其他人武大郎写了,一起也不让其他人读!

然后,有人在读服务注册表的数亚马逊我国据的时分,其他人都能够随意一起读,可是此刻不答应他人写服务注册表数据了!

对吧,咱们想要的,其实不便是这个作用吗?

想清楚了这点,咱们就不应该暴力的加一个synchronized,让一切读写线程悉数串行化,由于那样会导致并发性十分的低。

咱们看看下面的图,咱们想要的第一个作用:一旦有人在写服务注册表数据,咱们加个写锁,此刻他人不能写,也不能读。

假如有人在读数据呢?此刻就可协作协议以让他人都能够读,可是不答应任何人写。

咱们看下面的图:

要害点来了,这g7568样做有什么优点呢?

其实大部分时分都是读操作,所以运用读锁能够让大河南豫剧量的悍妻当家娘子轻点打线程一起来读数据,不需求堵塞不需求排队,确保高并发读的功能是比较高的。

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

此刻写数据的时分,只能一个一个的加写锁然后写数据,一起写数据的时分就不答应他人来读数据了。

因而读写锁十分合适这淮北种读多写少的场景的。

别的,咱们能不能尽量在写数据期间还确保能够继续读我的明星老豆数据呢?很多加读锁的时分,会堵塞人家写数据加写锁过长时刻,这种状况能否防止呢?

能够的,选用多级缓存的机制,详细能够参与之前的一篇文章:【双11狂欢的背面】微服大头菜务注册中心是怎样承载大型体系千万级拜访的》。里边剖析了Spring Cloud Eureka微服务注册中心里的多级缓存机制。

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

标签: 未定义标签
admin 14文章 0评论 主页

  用户登录