成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

12 張圖 | 硬剛了一波,三層緩存架構(gòu)

存儲
本篇悟空哥會帶著大家來看下 Eureka 的緩存架構(gòu)是怎么樣,通過學(xué)習(xí)這篇,我們也可以借鑒 Eureka 的緩存設(shè)計(jì)思想,將其運(yùn)用到項(xiàng)目當(dāng)中。

一、前言

上一講我們講到了 Eureka 注冊中心的 Server 端有三級緩存來保存注冊信息,可以利用緩存的快速讀取來提高系統(tǒng)性能。我們再來細(xì)看下:

一級緩存:只讀緩存 readOnlyCacheMap,數(shù)據(jù)結(jié)構(gòu) ConcurrentHashMap。相當(dāng)于數(shù)據(jù)庫。

二級緩存:讀寫緩存 readOnlyCacheMap,Guava Cache。相當(dāng)于 Redis 主從架構(gòu)中主節(jié)點(diǎn),既可以進(jìn)行讀也可以進(jìn)行寫。

三級緩存:本地注冊表 registry,數(shù)據(jù)結(jié)構(gòu) ConcurentHashMap。相當(dāng)于 Redis 主從架構(gòu)的從節(jié)點(diǎn),只負(fù)責(zé)讀。

看圖更清晰,如下圖所示:

三種緩存

另外 ConcurrenthashMap 也是一種 map 結(jié)構(gòu),也就是以鍵值對的方式進(jìn)行存儲,如下圖所示:

Map 結(jié)構(gòu)

本篇悟空哥會帶著大家來看下 Eureka 的緩存架構(gòu)是怎么樣,通過學(xué)習(xí)這篇,我們也可以借鑒 Eureka 的緩存設(shè)計(jì)思想,將其運(yùn)用到項(xiàng)目當(dāng)中。

二、引發(fā)的幾個思考

我們再來看下 Eureka 源碼,其實(shí)不難看懂,下面會做解釋。

  • 默認(rèn)會先從只讀緩存里面找。
  • 沒有的話,再從讀寫緩存里面找。
  • 找到了的話就更新只讀緩存,并返回找到的緩存。
  • 還找不到的話,就從本地緩存 registry 中加載進(jìn)來。

帶來了三個問題:

(1)三級緩存數(shù)據(jù)怎么來的?

(2)緩存數(shù)據(jù)如何更新的?

(3)緩存如何過期?

三、本地緩存

我們先來看下本地緩存 registry,它是一種定義為 ConcurrentHashMap 的數(shù)據(jù)結(jié)構(gòu),之前也詳細(xì)講解過。

當(dāng)客戶端發(fā)起注冊請求的時候,就會把注冊信息放到 registry 中。如下代碼所示:

  1. registry.putIfAbsent(app) 

putIfAbsent 表示如果存在重復(fù)的 key,就不會放入值,如果傳入的 key 對應(yīng)的 value 已經(jīng)存在,就返回存在的 value,不進(jìn)行替換。

經(jīng)過 putIfAbsent 操作就把客戶端的注冊信息放到 registry 中了。

我們再來看下其中的一種緩存結(jié)構(gòu):讀寫緩存。

四、讀寫緩存

讀寫緩存,顧名思義,就是既可以進(jìn)行讀,也可以進(jìn)行寫的緩存。讀主要是給只讀緩存來讀取的。寫主要是將緩存更新到自己的 Map 中。

下面分別從寫緩存的原理、寫緩存的源碼、過期時機(jī)的原理、過期時機(jī)的源碼幾個方面來分別解答。

4.1 寫緩存的原理和源碼

我開始以為當(dāng)我們讀緩存讀不到的時候,就會去數(shù)據(jù)庫查了。找了半天,沒找到讀數(shù)據(jù)庫的地方。

然后我就用 IDEA 工具查找 readOnlyCacheMap 被使用的地方,終于讓我找到了。

讀寫緩存用的是 Guava Cache工具類,這篇不會深究。簡單來說就是當(dāng)訪問讀寫緩存時,如果這個 key 在緩存中不存在,則從本地去查,查到后再放回緩存。

然后又實(shí)現(xiàn)抽象方法 load(key),這個方法的作用就是當(dāng)讀寫緩存中沒有,則從本地 registry 緩存中拿。

讀寫緩存過期的時候其實(shí)分兩種:定時過期和實(shí)時過期。由于上面的源碼已經(jīng)定義了定時過期的時間間隔,所以我們先來看定時過期。

4.2 定時過期

當(dāng)構(gòu)建這個讀寫緩存時,就會定義間隔多久過期整個讀寫緩存。如下代碼所示,180 s 會定時過期讀寫緩存。

  1. expireAfterWrite(180s) 

4.3 實(shí)時過期

當(dāng)有新的服務(wù)實(shí)例進(jìn)行注冊或者下線、發(fā)生故障時,就會把這個對應(yīng)的服務(wù)實(shí)例的緩存給過期掉。

如下圖所示,最上面的是注冊中心,下面三個是服務(wù)實(shí)例。服務(wù)實(shí)例發(fā)生注冊、下線、發(fā)生故障,注冊中心都是可以感知到的,然后就會主動過期讀寫緩存對應(yīng)的服務(wù)實(shí)例。

4.4 實(shí)時過期源碼

從源碼層面我們再來看下讀寫緩存過期的源碼。調(diào)用了 invalidateCache 方法,進(jìn)行過期。

文件路徑:com/netflix/eureka/registry/AbstractInstanceRegistry.java

五、只讀緩存

5.1 定時更新

只讀緩存 readOnlyCacheMap,有一個定時更新的機(jī)制,每隔 30 秒就會更新一次只讀緩存中的某些 key。

它其實(shí)是遍歷自己的所有注冊信息,然后和讀寫緩存進(jìn)行比對,如果注冊信息不一致,則替換為讀寫緩存的數(shù)據(jù)。

源碼如下,有一個定時調(diào)度任務(wù),每隔 30 秒調(diào)度一次。

5.2 更新

另外當(dāng)客戶端獲取注冊信息時,也會先讀只讀緩存,如果只讀緩存中沒有,則會從讀寫緩存中找,找到后就放到只讀緩存中。如果讀寫緩存中沒有,則從本地注冊表 registry 中加載到讀寫緩存中,然后將注冊表信息返回。

這里大家是否有個疑問:既然這個緩存叫做只讀緩存,怎么還能被更新,不應(yīng)該是不變的嗎?

其實(shí)這里的不變是相對于客戶端來說的,客戶端獲取注冊表信息時,最開始訪問的就是只讀緩存,類似數(shù)據(jù)庫或 Redis 的主從架構(gòu),主負(fù)責(zé)讀寫,從負(fù)責(zé)讀。然后系統(tǒng)內(nèi)部會把主節(jié)點(diǎn)的信息同步給從節(jié)點(diǎn)。大家明白了嗎?

六、緩存相關(guān)配置

下面我們來看下 Eureka Server 對于緩存有哪些配置呢?

6.1 是否開啟只讀緩存

eureka.server.useReadOnlyResponseCache

當(dāng)客戶端獲取注冊信息時,是否先從只讀緩存獲取。如果為 false,則直接從讀寫緩存獲取。默認(rèn)為 true。

6.2 定時更新只讀緩存的間隔時間

eureka.server.responseCacheUpdateIntervalMs

默認(rèn)每隔 30 秒將讀寫緩存更新的緩存同步到只讀緩存。

七、緩存帶來的問題

三級緩存看似可以帶來性能的提升。但是也會引入其他問題,比如緩存不一致問題。

只讀緩存每隔 30s 才會刷新一次,和讀寫緩存會造成數(shù)據(jù)的不一致,客戶端在 30s 內(nèi)獲取的注冊表信息是滯后的。

當(dāng)使用 Eureka 集群時,這種緩存不一致的問題會更明顯,不同的節(jié)點(diǎn)之間也會出現(xiàn)只讀緩存的數(shù)據(jù)不一致,所以 Eureka 只能保證高可用,并不能保證強(qiáng)一致性,也就是保證了 AP,不保證 CP,另外我們可以選用強(qiáng)一致性的注冊中心,比如 Zookeeper、Nacos,這是后續(xù)要講的內(nèi)容了。

如何緩解不一致的問題呢?

(1)在服務(wù)端,我們可以設(shè)置更新只讀緩存的時間間隔,默認(rèn)是 30 秒,縮短一點(diǎn),比如 15 秒,頻率太高,可能對 Eureka 造成性能問題。

(2)服務(wù)端,我們也可以考慮關(guān)閉從只讀緩存讀注冊表信息,Eureka Client 直接從讀寫緩存讀取。

八、總結(jié)

Eureka Server 注冊表三級緩存架構(gòu)

本篇學(xué)習(xí)了 Eureka 注冊中心 Server 端的三層緩存架構(gòu),分為 registry、readOnlyCacheMap、readWriteCacheMap,用來保存服務(wù)注冊信息。

  • 默認(rèn)情況下,每隔 30 秒從讀寫緩存將注冊信息更新到只讀緩存。
  • 默認(rèn)情況下,客戶端讀取注冊表時,先從只讀緩存讀,如果沒有,則從讀寫緩存中讀取,如果還是沒有,則從本地注冊表 registry 讀取。
  • 默認(rèn)情況下,每隔 180 秒定時過期讀寫緩存。
  • 服務(wù)實(shí)例注冊、下線、故障時,會實(shí)時過期讀寫緩存。
  • 引入了多級緩存,也會帶來緩存不一致的問題。

參考資料:

www.passjava.cn

《微服務(wù)架構(gòu)深度解析》

 

Eureka 源碼

 

責(zé)任編輯:武曉燕 來源: 悟空聊架構(gòu)
相關(guān)推薦

2011-04-19 13:53:41

三層架構(gòu)

2020-08-06 17:16:47

抖音Tiktok美國

2021-12-07 08:27:19

RTTI運(yùn)行類型

2009-08-26 18:20:42

三層架構(gòu)

2021-01-01 09:03:44

故障HAProxy服務(wù)器

2013-01-09 11:00:20

架構(gòu)開發(fā)三層架構(gòu).NET架構(gòu)

2022-06-12 15:15:32

Linux交換機(jī)

2009-07-28 17:25:14

ASP.NET三層結(jié)構(gòu)

2011-08-08 14:14:03

架構(gòu)

2018-01-03 14:34:40

APM監(jiān)控系統(tǒng)OSGI架構(gòu)實(shí)踐

2009-07-29 09:07:51

Linux驅(qū)動開源操作系統(tǒng)微軟

2012-02-03 09:44:33

.NET

2021-09-01 13:46:07

GitHub Copi漏洞代碼訓(xùn)練

2015-07-02 10:57:11

General框架架構(gòu)開發(fā)

2018-10-31 14:32:53

數(shù)據(jù)中心網(wǎng)絡(luò)架構(gòu)

2009-07-28 15:08:50

MVC三層架構(gòu)實(shí)例

2009-04-30 15:56:50

三層架構(gòu)MVCMVP

2018-03-08 15:30:31

超融合架構(gòu)傳統(tǒng)三層架構(gòu)

2021-11-08 12:44:48

AndroidC++內(nèi)存

2021-12-26 00:13:24

Log4jLogback漏洞
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日本电影一区二区 | 日韩高清一区 | 亚洲a毛片 | 五月天婷婷狠狠 | 欧美日韩国产一区二区三区 | 一区二区三区四区在线免费观看 | 中文字幕日韩欧美一区二区三区 | 亚洲国产成人精品女人久久久 | 男人天堂色 | 成人高清在线视频 | 亚洲在线 | 色橹橹欧美在线观看视频高清 | 国产成人在线一区 | 亚洲网址 | 亚洲精品1区2区3区 91免费看片 | 黄免费在线| 欧美日韩亚 | 国产成人av一区二区三区 | 一级毛片视频在线 | 色综久久 | 国产精品夜夜春夜夜爽久久电影 | 91精品国产一二三 | 91成人在线视频 | 亚洲精品久久久久久久久久久久久 | 91丨九色丨国产在线 | 黄色在线观看网站 | 亚洲综合久久久 | 国产午夜av片 | av影片在线 | 亚洲网址在线观看 | 欧美一区二区三区高清视频 | 亚洲视频在线观看 | 免费欧美| 韩日在线 | 国产精品精品视频一区二区三区 | 国产美女精品视频免费观看 | 视频在线h | 欧美日韩国产一区二区三区 | 日韩欧美在线一区 | 日本高清中文字幕 | 亚洲色图第一页 |