主頁 > 軟體設計 > 大廠都咋用平臺、分布式快取?起碼你要懂技術,高級還得懂業務

大廠都咋用平臺、分布式快取?起碼你要懂技術,高級還得懂業務

2021-01-10 10:09:32 軟體設計

image
所有程式猿都對那快取并不陌生,好似那風一樣的女子只為你獨自而舞,只見那回眸一笑百媚生,讓你甚是吝惜,惹人憐愛,

但隨著專案規模不斷增大變強,光是單個快取就難以招架,優而顯得力不從心,

這時伴隨著多級快取得化繭成蝶,平臺級快取和分布式快取在應用上就都相輔相成,

但一山難容二虎,往往存有3大問題——①概念難以區分②我到底應該選擇誰③各自適用于什么場景

如果這個沒弄明白,我怕是覺得你還不大行額,

本篇我將已老生常談的態度來為大家一一揭曉,同時掌握方案與場景,設計技術選型的原理,包括一線大廠在本章節可能涉及的常考點
image

何為平臺級快取與分布式快取?

平臺級快取是指你所選擇編程語言下的快取技術型別

它是在語言的前提條件下,來采用的快取技術,也就是你用什么語言,就采用它存在的快取技術,

快取是工具,供編程語言呼叫,前者為后者服務,得有一個主次的關系,
所以有時 你要控制你自己呀,別給自己飆車的速度,不然翻車了你都不知道

在這里插入圖片描述

比如:
你在淘寶開了個新店鋪,這時你需要對你的店鋪進行裝飾打扮,那就需要使用淘寶這個平臺上提供的功能來進行裝飾,
像上傳商品配圖、店鋪布局風格等,
換句話說平臺級快取是依附于平臺的特性而決定的,

上篇也提到在不同的編程語言下,平臺級快取也不相同,比如:

  • PHP里面Smarty模板庫
  • Java中如Ehcache,Cacheonix,Voldemort,JBoss Cache,OSCache等等,

而且按照應用層的定義來看,平臺級快取可根據行程執行使用的方式劃分為行程內快取和行程外快取,

那什么是行程內、行程外快取呢?

  • 行程內快取

就是快取資料存在于所屬應用行程之內,和應用業務代碼、變數、堆疊等型別共同享受應用行程的記憶體資源, 快取就是在行程內中的資料段進行站位,

或者說原來你1人住1房間,現在你和別人一起住,
在這里插入圖片描述

  • 行程外快取

指快取資料存盤的地方不在使用應用內,而是外部的其它行程來存盤,比如像:Redis、memcache之類,
在這里插入圖片描述

那如果快取以檔案形式保持咋辦呀? 也算應用行程外?
放心,我乃吒吒輝,而不是渣渣輝,呸,渣男

因大多數快取都是在記憶體里面來進行操作,所以常常會忽視以檔案形式來保存的資料檔案,像這種情況它還是平臺級快取下的行程內快取,不是行程外快取,

因為這個檔案的快取是服務于應用行程,而你像Redis那種角色,它是獨立的行程,行程和行程本身是有隔離的,而且它們還是不同軟體的行程,就更沒得啥關系,

而且檔案快取里面的內容都是提前把邏輯處理的資料存入進取,當使用時,就可以減少重復的讀取、計算資料的動作從而來達到快取的效果,

那如果我把Redis獨立部署到其它服務器里面,也是行程外快取嗎?

image

這樣的情況它就是了,上面提到行程外快取是相對應用行程而言的,現在它們存在于不同的服務器,如果是在同一臺服務器里面部署,那也算行程外快取,因為行程是隔離的,但一般Redis部署到其它服務器我們不會這樣稱呼

那它這叫啥呢?

這種情況稱分布式快取,常說的分布式快取就是這種形式存在于世,

分布式快取也很好理解,首先看分布式,它表示把不同的軟體分別部署在不同的服務器上或者同一服務器上不同的軟體服務,

注:這里【分布式快取】是個相對概念,如果按分布式概念看,一臺服務器上部署了PHP|JAVA和Redis,它們之間的關系也算分布式,
但我們現在是從行程內外快取的概念劃分,這樣一看,它就不屬于分布式快取了,大家知道統一的說法即可

哎呀,累死個人,吒男能這樣,面面俱到?有點繞,你老慢著點,細細品味

image

為何使用平臺級與分布式快取?

無論什么型別的快取,使用它們的根本目標就是減少資料的邏輯運算,加快請求回應,進而提高網站的QPS, 只不過體現的地方是不一樣的罷了,

那平臺級和分布式快取都有神馬好處?

平臺級

優點:

  • 時延更低,能夠節省內網帶寬

平臺級快取,由于資料不需要跨網路傳輸,直接在本地記憶體中操作,故性能好,時延低,消耗的帶寬也較少,

  • 不需要引入第三方類別庫,開箱即用

一般平臺級快取,都會有官方提供的相關操作類別庫,并不需要引入第三方的類別庫,降低了業務開發的關聯,

缺點:

  • 存盤容量有限,無法進行大資料存盤

由于記憶體占用了應用行程的記憶體空間,如 Java 行程的 JVM 記憶體空間,故不能進行大資料量的資料存盤,

  • 微服務架構中,集群部署資料的更新問題,

平臺快取資料存盤于應用行程內,故無法被其他應用行程訪問,在集群部署中同一快取資料需要部署多份,

如果對應資料庫的資料,存在更新動作,則需要同步更新到不同部署節點的本地快取,這樣才能保證資料一致性,這時復雜度較高并且容易出錯,

可以采用如基于 Redis 的發布訂閱機制來同步更新各個部署節點或者中間件進行異步資料更新,

  • 資料隨應用行程的重啟或崩潰而丟失

平臺快取資料是存盤在應用行程的記憶體空間,所以當應用行程重啟時,快取資料也會丟失,所以對于需要持久化的資料,要注意及時保存,否則可能會造成資料丟失,

分布式快取

優點:

  • 性能、存盤容量無上限,理論上可做到無限擴充

雖然本地快取快,但終究在單機上,資源性能都有上限,

而分布式快取是獨立部署的行程,自身擁有獨立的記憶體空間,不會受到應用行程重啟的影響,同時硬體資源也是獨享,

如果一臺機器性能不夠,就可以采用集群的方式拓展,做到線性的擴容,在配合docker容器,瞬間 beautiful

  • 資料集中存盤,保證資料一致性,也做到了業務上的解耦

image
雖然快取是以分布式的方式存盤,但部署模式會采用集群來保證高可用,

這樣所有的快取資料都維護在快取集群當中,故不存在像本地快取資料更新的問題,也保證了不同節點應用行程的資料一致性問題,

以前快取和業務是在一起使用,現在業務和快取剝離開來,互不影響,從而做到了業務上的拆分,

  • 資料從業務上做讀寫分離,保證網站高性能,高可用

分布式快取一般支持資料副本機制,從業務上課實作讀寫分離,故可以解決高并發場景中并發讀寫性能問題,

由于在多個快取節點也冗余了資料,提高了快取資料的可用性,避免某個快取節點宕機導致資料不可用問題,

那什么是讀寫分離?

讀寫分離是指把網站中用戶請求,按照讀、寫請求進行劃分,常常需要配合MySQL主從,主庫針對用戶寫請求,從庫針對用戶讀請求,

如果不做讀寫分離那么請求都會走一臺機器,所以讀寫分離在一定程度上也做到了負載均衡,還可以針對單一型別的請求來做到專治,
image

比如:主庫針對寫請求,那可以省去索引的創建,而從庫針對讀請求,需要索引來處理,這樣就可以根據請求型別來選擇是否使用索引,

畢竟索引維護也是需要消耗資源的,誰讓咋的心眼兒細呢?不小心看到了

原來讀寫分離就是這樣的啊,那我知道了

這個,其實這里小吒只是拋轉引玉了下,但大致意思都差不多,根本就是把讀寫請求分開,然后進行專治,

又比如:針對網站架構時,也可以采用讀寫分離的機制來部署網站子系統,針對搜索的業務,可以完全獨立部署search_product.com,由它來提供搜索頁面,

再來比如:針對要提高業務的處理能力,咱們快取的主從架構照樣可配合讀寫分離,加速網站的處理,

還來比如:針對訪問量過高,可以通過讀寫佇列來進行流量消費和異步批量寫機制,來提高網站的處理能力和寫負載過高等問題,
等等還有其它的,但大家要明白讀寫分離的作用,而且有時候它還會配合業務進行調整的,

你TM吒吒輝有完沒完了,一口氣說完不行了,我這個暴脾氣給你慣得,

在這里插入圖片描述

缺點:

  • 運維和部署上成本高

由于是分布式部署方式,部署、運維起來還是比較有技術難度,因為每臺服務器的運行情況你肯定都要知道,外加線上環境的不確定因素,直接頭大

但方案能抗住大流量,方案還是可取,同時基于Docker在部署上也會減輕很多壓力, 橫豎你都占一樣嘛,不然咋個辦呢?

  • 技術結構復雜,需要考慮快取雪崩、擊穿等問題

在這里插入圖片描述

分布式快取中的資料量肯定不少,對業務方來說需要,考慮快取的擊穿、雪崩、穿透等問題,防止意外情況下請求直接打到資料庫造成資料庫崩潰的問題,

  • 資料跨網路傳輸,性能低于本地快取

分布式快取部署一般都是與應用行程位于不同的機器,故需要通過外網來進行網路資料傳輸,相對于平臺快取的行程內部資料讀取操作,性能會較低,

平臺級與分布式快取的技術選項?

每個技術都會有自己的立場,在什么情況來選擇用什么樣的技術內容,還是得根據你專案需求情況來進行選擇

  • 看速度?選平臺級快取

平臺快取的優勢就是處于應用行程內部,離程式是最近的,如果某部分資料不大,但是訪問量比較高,直接使用它來做處理, 簡直是省心有省力氣,在加上AOP切面編程,簡直舒服的不要不要的,

例如:

如果想首頁、活動頁里面的展示一些統計或推薦的資訊,有了它就不用每次都去呼叫相同API來進行運算操作,只要記得定時更新平臺快取即可,

在這里插入圖片描述

  • 看資料量?選分布式快取

平臺快取受限于應用行程方,存盤有限,在大流量、海量資料的規模情況下,肯定選擇分布式快取,基于水平擴容、讀寫分離來滿足業務場景、資料存盤、性能需求等,

  • 綜合來看,有規模選分布式快取,規模一般選擇行程外快取,規模小你老看著辦?

網站上到大規模,你分布式那都跑不脫,
為了滿足高可用、高可靠機制,一般都會采用分布式集群的方式部署,這樣一個業務,會有多臺機器來提供服務,就算掛了一個主機,還有其它的頂上來,

那選擇平臺級快取有何問題?

  • 如果多機器采用平臺快取,那快取就有多份,一旦資料變更,就需要通知到多個上游服務方來更新資料,
  • 微服務模式下,一個頁面模塊的展示資料,在呼叫一個服務時可能需要拿到多個服務的資料聚合之后,才能最后回傳給客戶端展示,

這樣一個服務的資料發生變化就需要通知到剛開始調的服務來更新快取,業務上就耦合起來,而且還加入了很多附加作業,嚴重影響性能,

  • 資料的一致性問題,一個服務更新,如果網路有延遲或意外,導致更新的請求失敗,那么資料庫和快取的資料就存在不一致,

總結

  • 網站規模建議采用分布式快取,因為業務方和快取就不需要在業務上耦合,后期架構調整和維護都比較輕松,

  • 場景上選什么還是得根據業務需求和架構設計來綜合考慮,個人不大推薦平臺快取,業務職責更加清晰些,可能更好些,

思考題

  1. 什么是分布式快取?你用什么來做?什么條件下使用它?
  2. 平臺級快取你常用哪種?平臺級和分布式快取存在什么優缺點?
  3. 平臺級和分布式分別適合什么場景?
  4. 什么是讀寫分離?你有那些應用

如果感覺文章有幫助的話,求再看、求關注、求分享、求留言,各位的點贊支持,都是我創作的最大動力,

其實還有很多優化、架構等東西未分享,怕偏提,那咱們下期見,同時為了更好的幫助大家,我也整理了如下內容:
image

需要的小伙伴可微信搜索【蓮花童子哪吒】,這些其實還需要大家一起與我不斷完善,畢竟我個人是有限的,期待你的留言補充

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/246812.html

標籤:其他

上一篇:高可用MySQL資料庫之PXC集群

下一篇:來吧,展示。互聯網術語

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more