如何實現(xiàn)微服務(wù)前端數(shù)據(jù)加載

這篇文章主要講解了“如何實現(xiàn)微服務(wù)前端數(shù)據(jù)加載”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何實現(xiàn)微服務(wù)前端數(shù)據(jù)加載”吧!

成都創(chuàng)新互聯(lián)公司是一家網(wǎng)站設(shè)計公司,集創(chuàng)意、互聯(lián)網(wǎng)應(yīng)用、軟件技術(shù)為一體的創(chuàng)意網(wǎng)站建設(shè)服務(wù)商,主營產(chǎn)品:成都響應(yīng)式網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計、成都營銷網(wǎng)站建設(shè)。我們專注企業(yè)品牌在網(wǎng)站中的整體樹立,網(wǎng)絡(luò)互動的體驗,以及在手機等移動端的優(yōu)質(zhì)呈現(xiàn)。成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、移動互聯(lián)產(chǎn)品、網(wǎng)絡(luò)運營、VI設(shè)計、云產(chǎn)品.運維為核心業(yè)務(wù)。為用戶提供一站式解決方案,我們深知市場的競爭激烈,認真對待每位客戶,為客戶提供賞析悅目的作品,網(wǎng)站的價值服務(wù)。

目前在不少團隊里已經(jīng)逐步實踐落地了微服務(wù)架構(gòu),比如前端圈很流行的 BFF(Backend For Frontend)其實就是微服務(wù)架構(gòu)的一種變種,即讓前端團隊維護一套“膠水層/接入層/API層”的服務(wù),調(diào)用后臺團隊提供的若干個微服務(wù),將微服務(wù)的結(jié)果進行邏輯組裝,從而包裝出對外的 API。

在這種架構(gòu)下,服務(wù)在大體上可以分為兩種角色:

  1. 前端服務(wù)(Frontend),包裝底層的微服務(wù),對外直接暴露可調(diào)用的 API。例如在 BFF 架構(gòu)里,很可能就是一個 Node.js 寫成的 HTTP Server。

  2. 后臺微服務(wù)(Microservices),通常由后端團隊提供的單體服務(wù),承載不同模塊的功能,提供一系列的內(nèi)部調(diào)用接口。

最簡單的情形

我們先考慮一種最簡單的情形,也就是每當(dāng)有外部請求進來,那么前端服務(wù)都會向若干個后臺微服務(wù)請求數(shù)據(jù),然后進行邏輯處理,返回響應(yīng):

如何實現(xiàn)微服務(wù)前端數(shù)據(jù)加載

這種樸素的模型明顯存在一個問題:每個外部請求都會觸發(fā)多次內(nèi)部服務(wù)調(diào)用,這樣的做法非常浪費資源,因為對于大多數(shù)內(nèi)部微服務(wù)而言,請求的結(jié)果在一定的時間內(nèi)都是 可緩存 的。

比如用戶的頭像可能幾天幾周甚至幾個月才更新一次,這種情況下前端服務(wù)完全可以緩存用戶的頭像一段時間,這段時間內(nèi),讀取用戶頭像可以從直接從緩存內(nèi)讀取,而不需要請求后臺,很大程度上節(jié)省了后臺服務(wù)的負擔(dān)。

加入本地緩存

于是我們在前端服務(wù)中加入了本地內(nèi)存緩存(Local Cache),讓大多數(shù)請求都命中本地緩存,從而減少了后臺服務(wù)的負擔(dān):

如何實現(xiàn)微服務(wù)前端數(shù)據(jù)加載

本地緩存通常是放置在內(nèi)存里的,而內(nèi)存空間比較有限,所以我們需要引入 緩存淘汰 的機制,限制內(nèi)存最大容量。具體的緩存淘汰算法就有很多了,比如 FIFO、LFU、LRU、MRU、ARC 等等,可以根據(jù)業(yè)務(wù)的實際情況來選擇合適的算法。

引入本地緩存之后,依然會有一個問題:緩存只能在單個服務(wù)實例(服務(wù)實例可以理解為服務(wù)器、K8S Pod之類的概念)上生效,而大多數(shù)前端服務(wù)為了能夠橫向擴容,一般都是無狀態(tài)的,所以會有大量并存的實例。

也就是說,本地緩存可能只會在某臺服務(wù)器上生效,而其他平行的服務(wù)器上沒有緩存,如果請求打到了沒有緩存的服務(wù)器上,那么依然無法命中緩存。

如何實現(xiàn)微服務(wù)前端數(shù)據(jù)加載

另外一個問題就是,緩存邏輯和應(yīng)用邏輯是耦合的,每一個接口的代碼里可能都會存在類似這樣的邏輯:

var cachedData = cache.get(key)  if (cachedData !== undefined) {  return cachedData  } else {  return fetch('...')  }

Don't Repeat Yourself! 我們顯然需要把這段緩存邏輯抽象出來,避免重復(fù)代碼。

加入 Cache 層和中心化緩存

為了解決上面兩個問題,我們繼續(xù)改進我們的架構(gòu):

加入 中心化的遠程緩存 (比如 redis、Memcache),讓遠程緩存可以作用到所有實例上面;

將緩存、RPC 等非應(yīng)用層的邏輯 抽象為單獨的組件(Cache Layer) ,用來封裝后臺微服務(wù)的讀寫、本地緩存、遠程緩存相關(guān)的邏輯。

如何實現(xiàn)微服務(wù)前端數(shù)據(jù)加載

抽象出這樣一層 Cache Layer 之后,我們便可以進一步演進我們的服務(wù)。

加入緩存刷新機制

雖然我們有了中心化的緩存,但緩存畢竟只是短期內(nèi)有效的。一旦緩存失效,那就還是得向后臺服務(wù)請求數(shù)據(jù),在這種臨界條件下,請求耗時就會增加,出現(xiàn)耗時的毛刺現(xiàn)象(每隔一段時間,有小部分請求耗時變大)。

那么 有沒有辦法可以讓緩存一直保持“新鮮”呢 ?這就需要緩存刷新的機制了,大體上講,緩存刷新分為主動刷新和被動刷新兩種:

主動刷新

主動刷新即每當(dāng)數(shù)據(jù)有更新的時候,刷新緩存,下游服務(wù)永遠只讀取緩存內(nèi)的數(shù)據(jù)。

讀多寫少的后臺服務(wù)非常適合這種模式,因為讀請求永遠不會打到數(shù)據(jù)庫里,而是被分流到性能、擴展性高幾個檔次的緩存組件上面,從而很大程度上減輕數(shù)據(jù)庫的壓力。

如何實現(xiàn)微服務(wù)前端數(shù)據(jù)加載

當(dāng)然主動刷新也并不是完美無缺的,它意味著 前后端服務(wù)必須要在緩存組件上產(chǎn)生耦合 (比如需要約定緩存 key 的命名、數(shù)據(jù)結(jié)構(gòu)等),這就帶來了一定的隱患,一旦后端微服務(wù)錯誤地寫入了緩存,或者緩存組件出現(xiàn)可用性問題,結(jié)果很可能是災(zāi)難性的。所以這種模式更適合單個服務(wù)內(nèi)部,而不是多個服務(wù)之間。

被動刷新

被動刷新即讀取緩存數(shù)據(jù)的時候,根據(jù)緩存的剩余有效期或者類似指標(biāo),決定要不要異步刷新緩存(類似 HTTP 協(xié)議的 stale-while-revalidate )。

如何實現(xiàn)微服務(wù)前端數(shù)據(jù)加載

這種模式相比于主動刷新,優(yōu)點是服務(wù)間的耦合更少一些,但缺點在于 1. 只能根據(jù)訪問熱點進行緩存,無法全量緩存;2. 只能根據(jù)相關(guān)指標(biāo)被動刷新,降低了數(shù)據(jù)的即時性。

如果團隊的前端服務(wù)(如 BFF)和后臺服務(wù)是由兩套人員開發(fā)維護,比較適合使用這樣的緩存模式。當(dāng)然具體選擇哪種模式,得根據(jù)實際情況來決定。

緩存是一個非常靈活并且萬金油的組件,這里篇幅有限就不再深入,更多關(guān)于緩存的設(shè)計模式,可以參考這里:

donnemartin/system-design-primer  github.com

請求收斂

對于大流量的業(yè)務(wù)而言,可能同時會有成百上千的請求打到同一個前端服務(wù)實例上,這些請求會觸發(fā)大量的對緩存、后臺服務(wù)的讀請求,大多數(shù)情況下,這些并發(fā)的讀請求是可以 收歸為少數(shù)幾個請求 的。

如何實現(xiàn)微服務(wù)前端數(shù)據(jù)加載

這種思路和 Facebook 開源的dataloader 非常相似,將并行的、參數(shù)相同的請求收歸到一起,從而降低后端服務(wù)的壓力(在 GraphQL 的使用場景下很容易出現(xiàn)這種問題)。

容災(zāi)緩存

我們不妨考慮一種極端的情況:如果后臺服務(wù)全掛了,前端服務(wù)能不能使用緩存里的來“撐住”一段時間?這就是容災(zāi)緩存的概念,即 在服務(wù)異常的時候,降級到使用緩存中的數(shù)據(jù)來響應(yīng)外部請求,保證一定的可用性 。容災(zāi)緩存的邏輯,同樣可以抽象到 Cache Layer 中。

如何實現(xiàn)微服務(wù)前端數(shù)據(jù)加載

感謝各位的閱讀,以上就是“如何實現(xiàn)微服務(wù)前端數(shù)據(jù)加載”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對如何實現(xiàn)微服務(wù)前端數(shù)據(jù)加載這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

標(biāo)題名稱:如何實現(xiàn)微服務(wù)前端數(shù)據(jù)加載
鏈接URL:http://muchs.cn/article24/iejcce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、定制網(wǎng)站網(wǎng)站改版、App開發(fā)、用戶體驗響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)