當前位置:首頁 » 文件管理 » web多級緩存

web多級緩存

發布時間: 2023-05-21 10:08:50

A. 現在的微型計算機普遍配置cache是為了解決什麼

Caché,是 一種後關系型資料庫。能並發訪問同一數據的資料庫技術。

它獨一無二地提供了三核物種整合的、能並發訪問同一數據的資料庫技術:成熟的對象訪問方式,高性能的 SQL 訪問方式以及豐富的多維訪問。在對象數據、關系型數據以及多維數據視圖之間不需要映射,這樣就大大節省了開發和運行時間。

(1)web多級緩存擴展閱讀

Caché的作用:

(Caché提供了快速 Web 應用開發、高速的事務處理、大規模的擴展性、對事務數據的實時查詢。 Caché運行概述對Caché架構和性能進行了深層次的描述。 Caché的技術優勢主要在為什麼選擇Caché這一文檔中稱述。

在小冊子以多維引擎全面整合對象和 SQL 中,你可以了解到後關系型技術更多的優勢。 Caché問與答中主要回答了一些關於Caché的常見問題,以及為什麼增值商和企業選擇Caché來提升他們應用的性能。

熟悉Caché的訪問者可能想知道Caché 5 (最新的版本)磨核的情況,請訪問有哪些新增和升級的功能。文檔Caché:為專業開發者改游液而設計告訴了你Caché是如何滿足獨立軟體開發商需求的。

參考資料來源

網路-Caché

B. 最全從輸入URL到瀏覽器顯示頁面都發生了什麼前端瀏覽器渲染流程

首先了解一下URL的組成:

從上面的URL可以看出,一個完整的URL包括以下幾部分:

1、協議部分:該URL的協議部分為「http:」,這代表網頁使用的是HTTP協議。在Internet中可以使用多種協議,如HTTP,FTP等等本例中使用的是HTTP協議。在"HTTP"後面的「//」為分隔符

2、域名部分:該URL的域名部分為「www..com」。一個URL中,也可以使用IP地址作為域名使用

3、埠部分:跟在域名後面的是埠,域名和埠之間使用「:」作為分隔符。埠不是一個URL必須的部分,如果省略埠部分,將採用默認埠80

4、虛擬目錄部分:從域名後的第一個「/」開始到最後一個「/」為止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。本例歲明雹中的虛擬目錄是「/news/」

5、文件名部分:從域名後的最後一個「/」開始到「?」為止,是文件名部分,乎帆如果沒有「?」,則是從域名後的最後一個「/」開始到「#」為止,是文件部分,如果沒有「?」和「#」,那麼從域名後的最後一個「/」開始到結束,都是文件名部分。本例中的文件名是「index.asp」。文件名部分也不是一個URL必須的部分,如果省略該部分,則使用默認的文件名

6、錨部分:從「#」開始到最後,都是錨部分。本例中的錨部分是「name」。錨部分也不是一個URL必須的部分

7、參數部分:從「?」開始到「#」為止之間的部分為參數槐御部分,又稱搜索部分、查詢部分。本例中的參數部分為「boardID=5&ID=24618&page=1」。參數可以允許有多個參數,參數與參數之間用「&」作為分隔符。

很多大公司面試喜歡問這樣一道面試題, 輸入URL到看見頁面發生了什麼? ,今天我們來總結一下。 簡單來說,共有以下幾個過程

下面我們來看看具體的細節

輸入 www.google.com 網址後,首先在本地的域名伺服器中查找,沒找到去根域名伺服器查找,沒有再去 com 頂級域名伺服器查找,,如此的類推下去,直到找到IP地址,然後把它記錄在本地,供下次使用。大致過程就是 . -> .com -> google.com. -> www.google.com. 。 (你可能覺得我多寫 .,並木有,這個.對應的就是根域名伺服器,默認情況下所有的網址的最後一位都是.,既然是默認情況下,為了方便用戶,通常都會省略,瀏覽器在請求DNS的時候會自動加上)

既然已經懂得了解析的具體過程,我們可以看到上述一共經過了N個過程,每個過程有一定的消耗和時間的等待,因此我們得想辦法解決一下這個問題!

DNS存在著多級緩存,從離瀏覽器的距離排序的話,有以下幾種: 瀏覽器緩存,系統緩存,路由器緩存,IPS伺服器緩存,根域名伺服器緩存,頂級域名伺服器緩存,主域名伺服器緩存。

在你的chrome瀏覽器中輸入:chrome://dns/,你可以看到chrome瀏覽器的DNS緩存。

系統緩存主要存在/etc/hosts(linux系統)中

檢查瀏覽器是否有緩存

通過 Cache-Control 和 Expires 來檢查是否命中強緩存,命中則直接取本地磁碟的html(狀態碼為200 from disk(or memory) cache,內存or磁碟);


如果沒有命中強緩存,則會向伺服器發起請求(先進行下一步的TCP連接),伺服器通過 Etag 和 Last-Modify 來與伺服器確認返回的響應是否被更改(協商緩存),若無更改則返回狀態碼(304 Not Modified),瀏覽器取本地緩存;


若強緩存和協商緩存都沒有命中則返回請求結果。

不知道你們有沒有注意這樣一件事,你訪問http://.com的時候,每次響應的並非是同一個伺服器(IP地址不同),一般大公司都有成百上千台伺服器來支撐訪問,假設只有一個伺服器,那它的性能和存儲量要多大才能支撐這樣大量的訪問呢?DNS可以返回一個合適的機器的IP給用戶,例如可以根據每台機器的負載量,該機器離用戶地理位置的距離等等,這種過程就是DNS負載均衡

TCP 協議通過三次握手建立連接。

翻譯成大白話就是:

為什麼是3次? :避免 歷史 連接,確認客戶端發來的請求是這次通信的人。
為什麼不是4次? :3次夠了第四次浪費

建立連接的過程是利用客戶伺服器模式,假設主機A為客戶端,主機B為伺服器端。

採用三次握手是為了防止失效的連接請求報文段突然又傳送到主機B,因而產生錯誤。失效的連接請求報文段是指:主機A發出的連接請求沒有收到主機B的確認,於是經過一段時間後,主機A又重新向主機B發送連接請求,且建立成功,順序完成數據傳輸。考慮這樣一種特殊情況,主機A第一次發送的連接請求並沒有丟失,而是因為網路節點導致延遲達到主機B,主機B以為是主機A又發起的新連接,於是主機B同意連接,並向主機A發回確認,但是此時主機A根本不會理會,主機B就一直在等待主機A發送數據,導致主機B的資源浪費。

採用兩次握手不行,原因就是上面說的失效的連接請求的特殊情況。而在三次握手中, client和server都有一個發syn和收ack的過程, 雙方都是發後能收, 表明通信則准備工作OK.

為什麼不是四次握手呢? 大家應該知道通信中著名的藍軍紅軍約定, 這個例子說明, 通信不可能100%可靠, 而上面的三次握手已經做好了通信的准備工作, 再增加握手, 並不能顯著提高可靠性, 而且也沒有必要。

第一次握手

客戶端發送syn包(Seq=x)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;

第二次握手:

伺服器收到syn包,必須確認客戶的SYN(ack=x+1),同時自己也發送一個SYN包(Seq=y),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;

第三次握手:

客戶端收到伺服器的SYN ACK包,向伺服器發送確認包ACK(ack=y+1),此包發送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。

握手過程中傳送的包里不包含數據,三次握手完畢後,客戶端與伺服器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP 連接都將被一直保持下去。

要先申請CA證書,並安裝在伺服器上(一個文件,配置nginx支持監聽443埠開啟ssl並設置證書路徑)

瀏覽器發送請求;

網站從瀏覽器發過來的加密規則中選一組自身也支持的加密演算法和hash演算法,並向瀏覽器發送帶有公鑰的證書,當然證書還包含了很多信息,如網站地址、證書的頒發機構、過期時間等。

瀏覽器解析證書。

驗證證書的合法性。如頒發機構是否合法、證書中的網站地址是否與訪問的地址一致,若不合法,則瀏覽器提示證書不受信任,若合法,瀏覽器會顯示一個小鎖頭。

若合法,或用戶接受了不合法的證書,瀏覽器會生成一串隨機數的密碼(即密鑰),並用證書中提供的公鑰加密。

使用約定好的hash計算握手消息,並使用生成的隨機數(即密鑰)對消息進行加密,最後將之前生成的所有消息一並發送給網站伺服器。

網站伺服器解析消息。用已有的私鑰將密鑰解密出來,然後用密鑰解密發過來的握手消息,並驗證是否跟瀏覽器傳過來的一致。然後再用密鑰加密一段握手消息,發送給瀏覽器。

瀏覽器解密並計算握手消息的HASH,如果與服務端發來的HASH一致,此時握手過程結束,之後所有的通信數據將由之前瀏覽器生成的隨機密碼並利用對稱加密演算法進行加密。這里瀏覽器與網站互相發送加密的握手消息並驗證,目的是為了保證雙方都獲得了一致的密碼,並且可以正常的加密解密數據,為後續真正數據的傳輸做一次測試。

發送HTTP請求
首先科補一個小知識,HTTP的埠為80/8080,而HTTPS的埠為443

發送HTTP請求的過程就是構建HTTP請求報文並通過TCP協議中發送到伺服器指定埠 請求報文由 請求行 請求抱頭 請求正文 組成。
請求行
請求行的格式為 Method Request-URL HTTP-Version CRLF eg: GET index.html HTTP/1.1 常用的方法有: GET , POST , PUT , DELETE , OPTIONS , HEAD 。
常見的請求方法區別
這里主要展示 POST 和 GET 的區別
常見的區別

注意一點你也可以在GET裡面藏body,POST裡面帶參數

重點區別

GET 會產生一個 TCP 數據包,而 POST 會產生兩個 TCP 數據包。
詳細的說就是:

注意一點,並不是所有的瀏覽器都會發送兩次數據包,Firefox就發送一次

請求報頭
請求報頭允許客戶端向伺服器傳遞請求的附加信息和客戶端自身的信息。

從圖中可以看出,請求報頭中使用了Accept, Accept-Encoding, Accept-Language, Cache-Control, Connection, Cookie等欄位。Accept用於指定客戶端用於接受哪些類型的信息,Accept-Encoding與Accept類似,它用於指定接受的編碼方式。Connection設置為Keep-alive用於告訴客戶端本次HTTP請求結束之後並不需要關閉TCP連接,這樣可以使下次HTTP請求使用相同的TCP通道,節省TCP連接建立的時間。

請求正文
當使用POST, PUT等方法時,通常需要客戶端向伺服器傳遞數據。這些數據就儲存在請求正文中。在請求包頭中有一些與請求正文相關的信息,例如: 現在的Web應用通常採用Rest架構,請求的數據格式一般為json。這時就需要設置 Content-Type: application/json 。
更重要的事情-HTTP緩存
HTTP屬於客戶端緩存,我們常認為瀏覽器有一個緩存資料庫,用來保存一些靜態文件,下面我們分為以下幾個方面來簡單介紹HTTP緩存

緩存的規則
緩存規則分為 強制緩存 協商緩存


強制緩存
當緩存資料庫中有客戶端需要的數據,客戶端直接將數據從其中拿出來使用(如果數據未失效),當緩存伺服器沒有需要的數據時,客戶端才會向服務端請求。

又稱對比緩存。客戶端會先從緩存資料庫拿到一個緩存的標識,然後向服務端驗證標識是否失效,如果沒有失效服務端會返回304,這樣客戶端可以直接去緩存資料庫拿出數據,如果失效,服務端會返回新的數據

強制緩存
對於強制緩存,伺服器響應的header中會用兩個欄位來表明——Expires和Cache-Control。


Expires
Exprires的值為服務端返回的數據到期時間。當再次請求時的請求時間小於返回的此時間,則直接使用緩存數據。但由於服務端時間和客戶端時間可能有誤差,這也將導致緩存命中的誤差,另一方面,Expires是HTTP1.0的產物,故現在大多數使用Cache-Control替代。


Cache-Control
Cache-Control有很多屬性,不同的屬性代表的意義也不同。

協商緩存
協商緩存需要進行對比判斷是否可以使用緩存。瀏覽器第一次請求數據時,伺服器會將緩存標識與數據一起響應給客戶端,客戶端將它們備份至緩存中。再次請求時,客戶端會將緩存中的標識發送給伺服器,伺服器根據此標識判斷。若未失效,返回304狀態碼,瀏覽器拿到此狀態碼就可以直接使用緩存數據了。
對於協商緩存來說,緩存標識我們需要著重理解一下,下面我們將著重介紹它的兩種緩存方案。
Last-Modified
Last-Modified:伺服器在響應請求時,會告訴瀏覽器資源的最後修改時間。

從字面上看,就是說:從某個時間節點算起,是否文件被修改了

這兩個的區別是一個是修改了才下載一個是沒修改才下載。
Last-Modified 說好卻也不是特別好,因為如果在伺服器上,一個資源被修改了,但其實際內容根本沒發生改變,會因為Last-Modified時間匹配不上而返回了整個實體給客戶端(即使客戶端緩存里有個一模一樣的資源)。為了解決這個問題,HTTP1.1推出了Etag。


Etag
Etag:伺服器響應請求時,通過此欄位告訴瀏覽器當前資源在伺服器生成的唯一標識(生成規則由伺服器決定)

但是實際應用中由於Etag的計算是使用演算法來得出的,而演算法會佔用服務端計算的資源,所有服務端的資源都是寶貴的,所以就很少使用Etag了。


緩存的優點

不同刷新的請求執行過程
瀏覽器地址欄中寫入URL,回車

F5

Ctrl+F5

伺服器處理請求並返回HTTP報文
它會對TCP連接進行處理,對HTTP協議進行解析,並按照報文格式進一步封裝成HTTP Request對象,供上層使用。這一部分工作一般是由Web伺服器去進行,我使用過的Web伺服器有Tomcat, Nginx和Apache等等 HTTP報文也分成三份, 狀態碼 響應報頭 響應報文


狀態碼
狀態碼是由3位數組成,第一個數字定義了響應的類別,且有五種可能取值:

平時遇到比較常見的狀態碼有:200, 204, 301, 302, 304, 400, 401, 403, 404, 422, 500
常見狀態碼區別
200 成功
請求成功,通常伺服器提供了需要的資源。
204 無內容
伺服器成功處理了請求,但沒有返回任何內容。
301 永久移動
請求的網頁已永久移動到新位置。 伺服器返回此響應(對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。
302 臨時移動
伺服器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求。
304 未修改
自從上次請求後,請求的網頁未修改過。 伺服器返回此響應時,不會返回網頁內容。
400 錯誤請求
伺服器不理解請求的語法。
401 未授權
請求要求身份驗證。 對於需要登錄的網頁,伺服器可能返回此響應。
403 禁止
伺服器拒絕請求。
404 未找到
伺服器找不到請求的網頁。
422 無法處理
請求格式正確,但是由於含有語義錯誤,無法響應
500 伺服器內部錯誤
伺服器遇到錯誤,無法完成請求。
響應報頭
常見的響應報頭欄位有: Server, Connection...。
響應報文
你從伺服器請求的HTML,CSS,JS文件就放在這裡面

就是 Webkit 解析渲染頁面的過程。

這個過程涉及兩個比較重要的概念 迴流 重繪 ,DOM結點都是以盒模型形式存在,需要瀏覽器去計算位置和寬度等,這個過程就是迴流。等到頁面的寬高,大小,顏色等屬性確定下來後,瀏覽器開始繪制內容,這個過程叫做重繪。瀏覽器剛打開頁面一定要經過這兩個過程的,但是這個過程非常非常非常消耗性能,所以我們應該盡量減少頁面的迴流和重繪

這個過程中可能會有dom操作、ajax發起的http網路請求等。

web-socket、ajax等,這個過程通常是為了獲取數據

setTimeout、setInterval、Promise等宏任務、微任務隊列

當Render Tree中部分或全部元素的尺寸、結構、或某些屬性發生改變時,瀏覽器重新渲染部分或全部文檔的過程稱為迴流。

會導致迴流的操作:

一些常用且會導致迴流的屬性和方法:

當頁面中元素樣式的改變並不影響它在文檔流中的位置時(例如:color、background-color、visibility等),瀏覽器會將新樣式賦予給元素並重新繪制它,這個過程稱為重繪。

JS的解析是由瀏覽器的JS引擎完成的。由於javaScript是單線程運行,也就是說一個時間只能幹一件事,干這件事情時其他事情都有排隊,但是有些人物比較耗時(例如IO操作),所以將任務分為 同步任務 非同步任務 ,所有的同步任務放在主線程上執行,形成執行棧,而非同步任務等待,當執行棧被清空時才去看看非同步任務有沒有東西要搞,有再提取到主線程執行,這樣往復循環(冤冤相報何時了,阿彌陀佛),就形成了Event Loop事件循環,下面來看看大人物

先看一段代碼

結果我想大家都應該知道。主要來介紹JavaScript的解析,至於Promise等下一節再說

JavaScript是一門單線程語言,盡管H5中提出了 Web-Worker ,能夠模擬實現多線程,但本質上還是單線程,說它是多線程就是扯淡。

既然是單線程,每個事件的執行就要有順序,比如你去銀行取錢,前面的人在進行,後面的就得等待,要是前面的人弄個一兩個小時,估計後面的人都瘋了,因此,瀏覽器的JS引擎處理JavaScript時分為 同步任務 非同步任務

這張圖我們可以清楚看到

js引擎存在monitoring process進程,會持續不斷的檢查主線程執行棧是否為空,一旦為空,就會去Event Queue那裡檢查是否有等待被調用的函數。 估計看完這些你對事件循環有一定的了解,但是事實上我們看對的沒這么簡單,通常我們會看到Promise,setTimeout,process.nextTick(),這個時候你和我就懵逼。

不同任務會進入不同的任務隊列來執行。 JS引擎開始工作後,先在宏任務中開始第一次循環( script裡面先執行,不過我喜歡把它拎出來,直接稱其進入執行棧 ),當主線程執行棧全部任務被清空後去微任務看看,如果有等待執行的任務,執行全部的微任務(其實將其回調函數推入執行棧來執行),再去宏任務找最先進入隊列的任務執行,執行這個任務後再去主線程執行任務(例如執行```console.log("hello world")這種任務),執行棧被清空後再去微任務,這樣往復循環(冤冤相報何時了)

下面來看一段代碼

我們看看它的執行情況

具體的執行過程大致就是這樣。


C. 高並發,你真的理解透徹了嗎


高並發,幾乎是每個程序員都想擁有的經驗。原因很簡單:隨著流量變大,會遇到各種各樣的技術問題,比如介面響應超時、CPU load升高、GC頻繁、死鎖、大數據量存儲等等,這些問題能推動我們在技術深度上不斷精進。

在過往的面試中,如果候選人做過高並發的項目,我通常會讓對方談談對於高並發的理解,但是能系統性地回答好此問題的人並不多。

大概分成這樣幾類:

1、對數據化的指標沒有概念 :不清楚選擇什麼樣的指標來衡量高並發系統?分不清並發量和QPS,甚至不知道自己系統的總用戶量、活躍用戶量,平峰和高峰時的QPS和TPS等關鍵數據。

3、理解片面,把高並發設計等同於性能優化 :大談並發編程、多級緩存、非同步化、水平擴容,卻忽視高可用設計、服務治理和運維保障。

4、掌握大方案,卻忽視最基本的東西 :能講清楚垂直分層、水平分區、緩存等大思路,卻沒意識去分析數據結構是否合理,演算法是否高效,沒想過從最根本的IO和計算兩個維度去做細節優化。

這篇文章,我想結合自己的高並發項目經驗,系統性地總結下高並發需要掌握的知識和實踐思路,希望對你有所幫助。內容分成以下3個部分:


高並發意味著大流量,需要運用技術手段抵抗流量的沖擊,這些手段好比操作流量,能讓流量更平穩地被系統所處理,帶給用戶更好的體驗。

我們常見的高並發場景有:淘寶的雙11、春運時的搶票、微博大V的熱點新聞等。除了這些典型事情,每秒幾十萬請求的秒殺系統、每天千萬級的訂單系統、每天億級日活的信息流系統等,都可以歸為高並發。

很顯然,上面談到的高並發場景,並發量各不相同, 那到底多大並發才算高並發呢?

1、不能只看數字,要看具體的業務場景。不能說10W QPS的秒殺是高並發,而1W QPS的信息流就不是高並發。信息流場景涉及復雜的推薦模型和各種人工策略,它的業務邏輯可能比秒殺場景復雜10倍不止。因此,不在同一個維度,沒有任何比較意義。

2、業務都是從0到1做起來的,並發量和QPS只是參考指標,最重要的是:在業務量逐漸變成原來的10倍、100倍的過程中,你是否用到了高並發的處理方法去演進你的系統,從架構設計、編碼實現、甚至產品方案等維度去預防和解決高並發引起的問題?而不是一味的升級硬體、加機器做水平擴展。

此外,各個高並發場景的業務特點完全不同:有讀多寫少的信息流場景、有讀多寫多的交易場景, 那是否有通用的技術方案解決不同場景的高並發問題呢?

我覺得大的思路可以借鑒,別人的方案也可以參考,但是真正落地過程中,細節上還會有無數的坑。另外,由於軟硬體環境、技術棧、以及產品邏輯都沒法做到完全一致,這些都會導致同樣的業務場景,就算用相同的技術方案也會面臨不同的問題,這些坑還得一個個趟。

因此,這篇文章我會將重點放在基礎知識、通用思路、和我曾經實踐過的有效經驗上,希望讓你對高並發有更深的理解。


先搞清楚高並發系統設計的目標,在此基礎上再討論設計方案和實踐經驗才有意義和針對性。

高並發絕不意味著只追求高性能,這是很多人片面的理解。從宏觀角度看,高並發系統設計的目標有三個:高性能、高可用,以及高可擴展。

1、高性能:性能體現了系統的並行處理能力,在有限的硬體投入下,提高性能意味著節省成本。同時,性能也反映了用戶體驗,響應時間分別是100毫秒和1秒,給用戶的感受譽梁是完全不同含咐的。

2、高可用:表示系統可以正常服務的時間。一個全年不停機、無故障;另一個隔三差五齣線上事故、宕機,用戶肯定選擇前者。另外,如果系統只能做到90%可用,也會大大拖累業務。

3、高擴展:表示系統的擴展能力,流量高峰時能否在短時間內完成擴容,更平穩地承接峰值流量,比如雙11活動、明星離婚等熱點事件。

這3個目標是需要通盤考慮的,因為它們互相關聯、甚至也會相互影響。

比如說:考慮系統的擴展能力,你會將服務慶老運設計成無狀態的,這種集群設計保證了高擴展性,其實也間接提升了系統的性能和可用性。

再比如說:為了保證可用性,通常會對服務介面進行超時設置,以防大量線程阻塞在慢請求上造成系統雪崩,那超時時間設置成多少合理呢?一般,我們會參考依賴服務的性能表現進行設置。

再從微觀角度來看,高性能、高可用和高擴展又有哪些具體的指標來衡量?為什麼會選擇這些指標呢?

2.2.1 性能指標

通過性能指標可以度量目前存在的性能問題,同時作為性能優化的評估依據。一般來說,會採用一段時間內的介面響應時間作為指標。

1、平均響應時間:最常用,但是缺陷很明顯,對於慢請求不敏感。比如1萬次請求,其中9900次是1ms,100次是100ms,則平均響應時間為1.99ms,雖然平均耗時僅增加了0.99ms,但是1%請求的響應時間已經增加了100倍。

2、TP90、TP99等分位值:將響應時間按照從小到大排序,TP90表示排在第90分位的響應時間, 分位值越大,對慢請求越敏感。

3、吞吐量:和響應時間呈反比,比如響應時間是1ms,則吞吐量為每秒1000次。

通常,設定性能目標時會兼顧吞吐量和響應時間,比如這樣表述:在每秒1萬次請求下,AVG控制在50ms以下,TP99控制在100ms以下。對於高並發系統,AVG和TP分位值必須同時要考慮。

另外,從用戶體驗角度來看,200毫秒被認為是第一個分界點,用戶感覺不到延遲,1秒是第二個分界點,用戶能感受到延遲,但是可以接受。

因此,對於一個 健康 的高並發系統,TP99應該控制在200毫秒以內,TP999或者TP9999應該控制在1秒以內。

2.2.2 可用性指標

高可用性是指系統具有較高的無故障運行能力,可用性 = 正常運行時間 / 系統總運行時間,一般使用幾個9來描述系統的可用性。

對於高並發系統來說,最基本的要求是:保證3個9或者4個9。原因很簡單,如果你只能做到2個9,意味著有1%的故障時間,像一些大公司每年動輒千億以上的GMV或者收入,1%就是10億級別的業務影響。

2.2.3 可擴展性指標

面對突發流量,不可能臨時改造架構,最快的方式就是增加機器來線性提高系統的處理能力。

對於業務集群或者基礎組件來說,擴展性 = 性能提升比例 / 機器增加比例,理想的擴展能力是:資源增加幾倍,性能提升幾倍。通常來說,擴展能力要維持在70%以上。

但是從高並發系統的整體架構角度來看,擴展的目標不僅僅是把服務設計成無狀態就行了,因為當流量增加10倍,業務服務可以快速擴容10倍,但是資料庫可能就成為了新的瓶頸。

像MySQL這種有狀態的存儲服務通常是擴展的技術難點,如果架構上沒提前做好規劃(垂直和水平拆分),就會涉及到大量數據的遷移。

因此,高擴展性需要考慮:服務集群、資料庫、緩存和消息隊列等中間件、負載均衡、帶寬、依賴的第三方等,當並發達到某一個量級後,上述每個因素都可能成為擴展的瓶頸點。

了解了高並發設計的3大目標後,再系統性總結下高並發的設計方案,會從以下兩部分展開:先總結下通用的設計方法,然後再圍繞高性能、高可用、高擴展分別給出具體的實踐方案。

通用的設計方法主要是從「縱向」和「橫向」兩個維度出發,俗稱高並發處理的兩板斧:縱向擴展和橫向擴展。

3.1.1 縱向擴展(scale-up)

它的目標是提升單機的處理能力,方案又包括:

1、提升單機的硬體性能:通過增加內存、 CPU核數、存儲容量、或者將磁碟 升級成SSD 等堆硬體的方式來提升。

2、提升單機的軟體性能:使用緩存減少IO次數,使用並發或者非同步的方式增加吞吐量。

3.1.2 橫向擴展(scale-out)

因為單機性能總會存在極限,所以最終還需要引入橫向擴展,通過集群部署以進一步提高並發處理能力,又包括以下2個方向:

1、做好分層架構:這是橫向擴展的提前,因為高並發系統往往業務復雜,通過分層處理可以簡化復雜問題,更容易做到橫向擴展。

上面這種圖是互聯網最常見的分層架構,當然真實的高並發系統架構會在此基礎上進一步完善。比如會做動靜分離並引入CDN,反向代理層可以是LVS+Nginx,Web層可以是統一的API網關,業務服務層可進一步按垂直業務做微服務化,存儲層可以是各種異構資料庫。

2、各層進行水平擴展:無狀態水平擴容,有狀態做分片路由。業務集群通常能設計成無狀態的,而資料庫和緩存往往是有狀態的,因此需要設計分區鍵做好存儲分片,當然也可以通過主從同步、讀寫分離的方案提升讀性能。

下面再結合我的個人經驗,針對高性能、高可用、高擴展3個方面,總結下可落地的實踐方案。

3.2.1 高性能的實踐方案

1、集群部署,通過負載均衡減輕單機壓力。

2、多級緩存,包括靜態數據使用CDN、本地緩存、分布式緩存等,以及對緩存場景中的熱點key、緩存穿透、緩存並發、數據一致性等問題的處理。

3、分庫分表和索引優化,以及藉助搜索引擎解決復雜查詢問題。

4、考慮NoSQL資料庫的使用,比如HBase、TiDB等,但是團隊必須熟悉這些組件,且有較強的運維能力。

5、非同步化,將次要流程通過多線程、MQ、甚至延時任務進行非同步處理。

6、限流,需要先考慮業務是否允許限流(比如秒殺場景是允許的),包括前端限流、Nginx接入層的限流、服務端的限流。

7、對流量進行 削峰填谷 ,通過 MQ承接流量。

8、並發處理,通過多線程將串列邏輯並行化。

9、預計算,比如搶紅包場景,可以提前計算好紅包金額緩存起來,發紅包時直接使用即可。

10、 緩存預熱 ,通過非同步 任務 提前 預熱數據到本地緩存或者分布式緩存中。

11、減少IO次數,比如資料庫和緩存的批量讀寫、RPC的批量介面支持、或者通過冗餘數據的方式幹掉RPC調用。

12、減少IO時的數據包大小,包括採用輕量級的通信協議、合適的數據結構、去掉介面中的多餘欄位、減少緩存key的大小、壓縮緩存value等。

13、程序邏輯優化,比如將大概率阻斷執行流程的判斷邏輯前置、For循環的計算邏輯優化,或者採用更高效的演算法。

14、各種池化技術的使用和池大小的設置,包括HTTP請求池、線程池(考慮CPU密集型還是IO密集型設置核心參數)、資料庫和Redis連接池等。

15、JVM優化,包括新生代和老年代的大小、GC演算法的選擇等,盡可能減少GC頻率和耗時。

16、鎖選擇,讀多寫少的場景用樂觀鎖,或者考慮通過分段鎖的方式減少鎖沖突。

上述方案無外乎從計算和 IO 兩個維度考慮所有可能的優化點,需要有配套的監控系統實時了解當前的性能表現,並支撐你進行性能瓶頸分析,然後再遵循二八原則,抓主要矛盾進行優化。

3.2.2 高可用的實踐方案

1、對等節點的故障轉移,Nginx和服務治理框架均支持一個節點失敗後訪問另一個節點。

2、非對等節點的故障轉移,通過心跳檢測並實施主備切換(比如redis的哨兵模式或者集群模式、MySQL的主從切換等)。

3、介面層面的超時設置、重試策略和冪等設計。

4、降級處理:保證核心服務,犧牲非核心服務,必要時進行熔斷;或者核心鏈路出問題時,有備選鏈路。

5、限流處理:對超過系統處理能力的請求直接拒絕或者返回錯誤碼。

6、MQ場景的消息可靠性保證,包括procer端的重試機制、broker側的持久化、consumer端的ack機制等。

7、灰度發布,能支持按機器維度進行小流量部署,觀察系統日誌和業務指標,等運行平穩後再推全量。

8、監控報警:全方位的監控體系,包括最基礎的CPU、內存、磁碟、網路的監控,以及Web伺服器、JVM、資料庫、各類中間件的監控和業務指標的監控。

9、災備演練:類似當前的「混沌工程」,對系統進行一些破壞性手段,觀察局部故障是否會引起可用性問題。

高可用的方案主要從冗餘、取捨、系統運維3個方向考慮,同時需要有配套的值班機制和故障處理流程,當出現線上問題時,可及時跟進處理。

3.2.3 高擴展的實踐方案

1、合理的分層架構:比如上面談到的互聯網最常見的分層架構,另外還能進一步按照數據訪問層、業務邏輯層對微服務做更細粒度的分層(但是需要評估性能,會存在網路多一跳的情況)。

2、存儲層的拆分:按照業務維度做垂直拆分、按照數據特徵維度進一步做水平拆分(分庫分表)。

3、業務層的拆分:最常見的是按照業務維度拆(比如電商場景的商品服務、訂單服務等),也可以按照核心介面和非核心介面拆,還可以按照請求源拆(比如To C和To B,APP和H5 )。


高並發確實是一個復雜且系統性的問題,由於篇幅有限,諸如分布式Trace、全鏈路壓測、柔性事務都是要考慮的技術點。另外,如果業務場景不同,高並發的落地方案也會存在差異,但是總體的設計思路和可借鑒的方案基本類似。

高並發設計同樣要秉承架構設計的3個原則:簡單、合適和演進。"過早的優化是萬惡之源",不能脫離業務的實際情況,更不要過度設計,合適的方案就是最完美的。

作者簡介:985碩士,前亞馬遜工程師,現大廠技術管理者。

D. 什麼是雲平台

  • 雲平台

    解釋如下:

  • 轉向雲計算(cloud computing),是業界將要面臨的一個重大改變。各種雲平台(cloud platforms)的出現是該轉變的最重要環節之一。顧名思義,這種平台允許開發者們或是將寫好的程序放在「雲」里運行,或是使用「雲」里提供的服務,或二者皆是。至於這種平台的名稱,現在我們可以聽到不止一種稱呼,比如按需平台(on-demand platform)、平台即服務(platform as a service,PaaS)等等。但無論稱呼它什麼,這種新的支持應用的方式有著巨大的潛力。

    應用平台(application platforms)是如何被使用的。開發團隊在創建一個戶內應用(on-premises application,即在機構內運行的應用)時,該應用所需的許多基礎都已經事先存在了:操作系統為執行應用和訪問存儲等提供了基礎支持;機構里的其他計算機提供了諸如遠程存儲之類的服務。倘若每創建一個戶內應用都得首先構建所有這些基礎的話,那麼恐怕我們今天看到的應用會少很多。

  • 中文名

  • 雲平台

  • 外文名

  • cloud platforms

  • 相關技術

  • 雲計算(cloud computing)

  • 別稱

  • 按需平台(on-demand platform)

  • 計算

  • 彈性虛擬計算

  • 目錄

  • 1三種雲服務

  • 2平台一般模型

  • 3戶內到雲平台

  • 4大企業雲平台

  • 5雲服務平台

  • 三種雲服務

    編輯

    雲平台(2)

參考:網頁鏈接

E. 資料庫系統概念 怎麼樣

本書已經是第六版了,不是經典不會這樣長盛不衰的。書很好,就是要花時間看了。
《》是經典的資料庫系統教科書《Database System Concepts》的最新修訂版,全面介紹資料庫系統的各種知識,透徹闡釋資料庫管理的基本概念。本書內容豐富,不僅討論了關系數據模型和關系語言、資料庫設計過程、關系資料庫理論、資料庫應用設計和開發、數據存儲結構、數據存取技術、查詢優化方法、事務處理系統和並發控制、故障恢復技術、數據倉庫和數據挖掘,而且對性能調整、性能評測標准、資料庫應用測試和標准化、空間和地理數據、時間數據、多媒體數據、移動和個人資料庫管理以及事務處理監控器、事務工作流、電子商務、高性能事務系統、實時事務系統和持續長時間的事務等高級應用主題進行了廣泛討論。
《》既可作為高年級本科生或低年級研究生的資料庫課程教材,也可供資料庫領域的技術人員參考。
作者簡介Abraham Silberschatz,於紐約州立大學石溪分校獲得博士學位,現為耶魯大學計算機科學Sidney J. Weinberg教授,計算機科學系主任,曾任貝爾實驗室信息科學研究中心副主任。他是ACM Fellow 和 IEEE Fellow,曾獲得IEEE Taylor L. Booth 教育獎、 ACM Karl V. Karlstrom 傑出教育者獎、ACM SIGMOD 貢獻獎和IEEE 計算機學會傑出論文獎。他的研究興趣包括操作系統、資料庫系統、存儲系統、網路管理和分布式系統。
Henry F. Korth ,於普林斯頓大學獲得博士學位,現為利哈伊大學計算機科學與工程系Weiseman教授,曾任貝爾實驗室資料庫原理研究中心主任。他是ACM Fellow 和 IEEE Fellow,是VLDB 10年貢獻獎的獲得者。他的研究興趣包括為現代計算架構(多核、多線程、多級緩存)設計的資料庫演算法、基於Web的大型數據倉儲、實時資料庫系統和並行系統。
S. Sudarshan於威斯康星大學麥迪遜分校獲得博士學位,現為印度理工學院計算機科學與工程系教授,曾為貝爾實驗室資料庫研究組技術人員。他的研究興趣包括查詢處理和優化、關系數據和圖結構數據的關鍵字查詢,以及構建和測試資料庫應用系統的工具。

F. OA系統如何優化OA以提高訪問速度

oa系統的優化,從多方面來處理
比如,雲海oa系統的架構是java架構的,採用多級緩存機制,以及h5無刷新瀏覽方式,再加上web冗兄慶余,漏帆資料庫讀寫分返塵雹離等,可以從多方位的來優化訪問速度。

G. 超線程技術

Intel的超線程(Hyper Threading)技術開創性地使用了"邏輯處理器"的技術,給應用帶來的影響不僅是以往的CPU主頻的提高,更具意義的是性能的顯著提升--超線程技術已經被驗證,在企業級計算領域,它能夠將伺服器執行兼容應用的性能提升30%,大大改進了系統響應速度,從而使伺服器能夠支持更多用戶。
當前的操作系統和伺服器應用已不再將不同應用的工作負載混為一個數據流,而是分為單獨的指令"線程"。在多路伺服器中,這些線程分別由不同的處理器來執行,從而性能遠遠超出了單處理器系統。憑借超線程技術,英特爾至強處理器操作系統和應用而言就是如同是兩個獨立?邏輯"處理器,能夠同時處理兩個"線程"。這一能力主要得益於英特爾NetBurst 微架構的不斷創新,它使處理器資源得以充分利用。超線程技術使一個物理處理器能夠同時執行兩個獨立的代碼流(稱為線程)。從體系結構上講,一個含有超線程技術的IA-32處理器相當於兩個邏輯處理器。而其中每個邏輯處理器都有自己的IA-32架構中心,在加電初始化後,每個邏輯處理器都可單獨被停止、中斷或安排執行某一特定線程,而不會影響晶元上另一邏輯處理器的性能。與傳統雙路(DP)配置不同(使用兩個獨立的物理IA-32處理器),在含有超線程技術的處理器,邏輯處理器共享處理器內核的執行資源,其中包括執行引擎、高速緩存、系統匯流排介面和固件等。
英特爾超線程技術可兼容現有的大多數多線程32位應用和操作系統,因而軟體將無需進行重新編譯。當前,業界正在展開優化工作,以使伺服器應用能夠最大限度利用超線程技術的優勢,如Web、目錄應用、安全應用、電子商務、CRM、協作、ERP/SCM和資料庫等。
超線程技術帶來的傑出業務優勢包括:較高的伺服器響應速度和數據處理速度帶來出色業務響應能力;更高效地利用處理器可用資源意味著支持更多的員工。
應用程序和操作系統的功能日益豐富,這需要更高的處理能力。病毒掃描、文件加密和電子郵件壓縮等IT後台服務使計算基礎設施更加穩健,但同時也增大了電腦處理器的負載。從而,現在含有多任務和後台處理的商用計算迫切需要一種新的方法來提高性能,以使系統保持出色的響應能力。超線程技術帶來的影響不可低估。英特爾超線程技術引入了台式機,來滿足這些需求,使商業用戶事半功倍。使用超線程技術,商業用戶可以最充分地利用Windows XP的優先多任務體系結構,同時運行多個要求最苛刻的應用程序,並保持系統的響應性。IT部門可以部署台式機後台服務,以使其環境更加安全、高效和易於管御辯舉理,同時最大限度地減少對最終用戶工作效率的影響。此外,商業用戶現在有能力處理以前曾無法處理的任務,如使用SAS進行數據採掘,同時用Excel宏分析數據,或者一邊使用Photoshop設計宣傳手冊,一邊使用Adobe Premiere渲染圖像。
超線程的優勢還不止這些。提高多任務環境中現有軟體及多線程應用的性能只是目前的收益。英特爾還正在與開發下一代解決方案的領先軟體公司通力合作,將超線程技術的極大優勢融入到這些解決方案之中。

Hyper-Threading 超線程技術

超線程從觀念上很容易理解,它讓一顆物理處理器在使用的時候看起來更象是兩個,處理器的資源被分成兩個邏輯的部分。對於用戶來說,這也意味著讓從前那些多用戶、多進程、多線程的軟體充分發揮效能的環境不再局限於物理多CPU--邏輯CPU也能夠起到接近的作用。
盡管超線程技術在P4 Xeon處理器中已經應用了半年有餘的時間,但是面對著未來集成了超線程技術的P4級別CPU,我們認為,還是有必要從更深的層次來挖掘超線程的技術細節以及它與P4核心的有效整合。很幸運,在11月初我們找到了Intel於今年2月份發布Xeon之前的一份內部技術資料--66頁的Intel超線程技術白皮書,在這份資料中,Intel詳細描述了超線程技術的由來鎮碧、架構、如何優化以及測試方法和測試數據。在此,灶盯我們願與讀者一起來共享這些知識,以便我們能夠一起來更多了解超線程的機理。
一. 應運而生,超線程誕生的背景

各個行業巨大的需求一直是推動CPU按照摩爾定律穩步進行性能提升的主要動力,尤其是在互聯網和通訊領域,為了滿足這些增長迅速的需求,我們無法再沿用傳統的僅提升CPU頻率的設計思路。微結構技術被用來從細節上提升CPU的性能,比如超流水線、亂序運行、超標運行、多級緩存等技術都有效的提升了CPU的性能,但是隨著這些技術的引入,我們正在使用的CPU也越來越復雜,它集成了越來越多的晶體管並且要求更高的電源供應。實際上,晶體管數量和電源供應增加的速度遠遠大於處理器性能提升的速度。

過去十年INTEL CPU性能提升與花費比較

我們來看上圖,它體現了過去10年Intel CPU性能提升與相應的成本提升速度的比較,為了減少微結構技術給最終比較結果造成的影響,我們假設這四代CPU都在使用同樣的製造工藝並且以486的速率作為基準。 在此表中我們可以看出,排除微結構技術的影響,Intel CPU整數運算的性能在這十年提升了5倍左右;與此同時,如果採用同樣工藝,CPU的封裝將要擴大15倍;相應的,在同樣的工藝下,電源供應的要求提升了將近18倍。 盡管這個例子顯示的是Intel的狀況,但我們會發現,任何一家高性能CPU的製造商,都面臨著同樣的困惑。

當然,我們上面假象的是製造工藝和技術都還停留在486的階段,隨著製造工藝的提高以及相關技術的不斷突破,我們並沒有看到上述的封包和電源需求的可怕狀況,但CPU更新速度在加快,現有的製造工藝很快就會捉襟見肘,如果依然按照現有的性能提升發展下去,很快瓶頸就會出現,所以,必須尋找其他的道路來降低提升性能被工藝束縛的危險,超線程正是在這樣一個背景下被Intel推向前台的。

二. 超線程的運行機理

超線程屬於線程級並行的一種,其實現在軟體發展的趨勢尤其是在伺服器軟體方面正是向著多線程的方向發展,比如在在線事務處理和Web服務中,大量的線程由來自不同IP的不用請求產生,如果這些線程不能夠並行處理, 那麼整個網路伺服器的性能將受到極大的影響;在桌面系統的軟體中也存在著這種趨勢,面對這樣的一個情況,Intel清楚的看到,充分利用現有系統資源,優化並完善線程級的並行處理,使多個線程能夠更好的同時處理,比不斷的增加晶體管的數量來達到CPU性能的提升更有效。

現有的已經在中高端伺服器/工作站領域充分利用的多處理器技術就可以被看作是線程級並行的一種,通過增加CPU的數目,系統的性能有了非常穩固的提升,將多個線程同時在多個處理器上同時運行,而不管它們是否來自一個程序。多處理技術目前已經是非常成熟的技術,但是它存在著成本的問題,無法進一步的在更主流的應用中普及。

近幾年,更多的線程級並行解決方案被提出,基於他們的產品也有不少已經發布,在其中有幾種典型的技術:

晶元級多進程:這種技術將兩個完全一樣的處理器封裝在一起,它們都擁有獨立的結構,共享大部分緩存資源,這種技術與傳統的多處理器技術有著很大的區別, 因為你完全可以使用多個採用這種技術來構造的CPU組成一個多處理器系統,但是它的缺點也很明顯,更大的封裝尺寸以及昂貴的製造成本使其無法成為主流的處理器製造技術。

分時多進程:這種技術是讓處理器在安排好的時序周期里交叉運行多個線程,這種技術在犧牲了頻率性能的同時,以最小的代價節省了浪費的時序周期,但是對於那種需要大量內存讀寫操作的線程,它的影響有限。

事件響應多進程:這種技術是在一個線程需要進行長時間的後台處理比如對緩存進行讀寫操作的時候,將處理器的操作權交給另外一個線程,它應用於需要進行大量讀寫操作的伺服器程序中對性能的提升很高。

並行多線程:無論是分時多進程還是事件響應多進程都有它無法避免的局限性,在它們的技術的基礎上,並行多線程提出了新的解決思路,它在一個處理器內部實現了無需切換的多個線程並行處理,它能夠更有效的利用處理器的資源,它是多種線程級並行方案中節約最多資源、提升性能最多並且適用范圍最廣的。

超線程就是並行多線程技術在Intel處理器架構中的體現,它在一個處理器的內部為每個邏輯處理器構建了一套架構狀態(Architecture State以下簡稱AS),每個AS包括一個處理器必須的一些寄存器,包括:通用狀態寄存器、控制寄存器、高級程序中斷寄存器以及其他一些處理一個線程必須的寄存器, 完整的復制AS需增加的晶體管數量非常有限;同時兩個邏輯處理器共享一套物理執行單元、分支預測單元、控制邏輯以及匯流排,從軟體操作的角度來看,這意味著操作系統和應用程序可以象在一台多處理器的系統中運行一樣來規劃它的進程或者線程運行。而從微架構的角度來看,這意味著來自邏輯處理器的指令將在共享的運算單元並行處理。

不包含多線程技術的處理器的多處理器系統

作為一個例子,上圖展示了一個典型的沒有多線程技術支持的多處理器系統,下圖展示了一個典型的採用多線程技術支持的CPU的多處理器系統,我們可以看到兩個物理的處理器內部被分成了4個邏輯的處理器。

使用多線程技術處理器的多處理器系統

在超線程技術產品化的過程中,還有幾個細節我們需要特別注意:

1. 盡量的縮小超線程技術對封包尺寸的影響:由於邏輯處理器共享了大部分的微結構資源而僅僅復制了一小部分必須的硬體資源,封包的尺寸僅僅增加了不到5%。

2. 當一個邏輯處理器停止運行的時候,另一個邏輯處理器應能夠繼續運行:一個邏輯處理器可能因為多種原因而暫時中斷,比如等待緩存讀寫、等待上一條指令的結果等等,Intel通過一個中立的程序來管理指令緩沖隊列,在有兩個線程在進行的時候,它不允許任何一個邏輯處理器獨占指令緩沖隊列,這樣就有效的避免了一個邏輯處理器獨占指令緩沖隊列並暫時中斷時,另外一個邏輯處理器也陷入無限悲慘之漫長等待。

3. 當只有一個線程運行時資源的調配:當只有一個線程在處理器中運行的時候,擁有超線程技術的處理器的運行效率能否達到同檔次沒有超線程技術的處理器呢?這意味著當只有一個線程運行時,所有的資源都應該調配給它以便它能夠更有效的運行,我們可以看到下面的圖,在P4的超級流水線上,任何兩個邏輯處理流程之間,都由緩沖隊列來進行分割,通過這種方式,它保證了任何正在進行的線程能夠根據緩沖隊列的擁擠程度來請求資源並逐步完成線程,而當只有一個線程存在時,由於緩沖隊列是空的,所以所有的資源都會提供給這個線程以保證它在最短時間完成操作。

要親身感受Hyper-Threading超線程技術,除了帶HT標志的P4外,以下的一些條件也是必不可少的,請看:

1、 採用含有HT技術的晶元組製造的主板。最新的Intel 845PE、845GE晶元組都支持HT技術;

2、 確保上述這類主板的BIOS中有開啟HT技術的選項,並將其打開;

3、 為HT超線程技術進行優化的操作系統(Microsoft Windows XP家庭版或專業版,以及Linux 2.4.18或更新的版本)。需要注意的事,您原有的Ghost鏡像文件已是無效的,必須在BIOS中打開HT後,重新安裝操作系統,再進行Ghost備份的鏡像文件才是支持HT超線程技術的;

4、 您的Microsoft Windows XP系統必須打好SP1補丁。

H. 架構高可用高並發系統的設計原則

通過學習《億級流量網站架構核心技術》及《linux就該這么學》學習筆記及自己的感悟:架構設計之高可用高並發系統設計原則,架構設計包括墨菲定律、康威定律和二八定律三大定律,而系統設計包括高並發原則、高可用和業務設計原則等。
架構設計三大定律
墨菲定律 – 任何事沒有表面看起來那麼簡單 – 所有的事都會比預計的時間長 – 可能出錯的事情總會出錯 – 擔心某種事情發生,那麼它就更有可能發生
康威定律 – 系統架構師公司組織架構的反映 – 按照業務閉環進行系統拆分/組織架構劃分,實現閉環、高內聚、低耦合,減少溝通成本 – 如果溝通出現問題,應該考慮進行系統和組織架構的調整 – 適合時機進行系統拆分,不要一開始就吧系統、服務拆分拆的非常細,雖然閉環,但是每個人維護的系統多,維護成本高 – 微服務架構的理論基礎 – 康威定律https://yq.aliyun.com/articles/8611– 每個架構師都應該研究下康威定律http://36kr.com/p/5042735.html
二八定律 – 80%的結果取決於20%的原因
系統設計遵循的原則
1.高並發原則
無狀態
無狀態應用,便於水平擴展
有狀態配置可通過配置中心實現無狀態
實踐: Disconf、Yaconf、Zookpeer、Consul、Confd、Diamond、Xdiamond等
拆分
系統維度:按照系統功能、業務拆分,如購物車,結算,訂單等
功能維度:對系統功能在做細粒度拆分
讀寫維度:根據讀寫比例特徵拆分;讀多,可考慮多級緩存;寫多,可考慮分庫分表
AOP維度: 根據訪問特徵,按照AOP進行拆分,比如商品詳情頁可分為CDN、頁面渲染系統,CDN就是一個AOP系統
模塊維度:對整體代碼結構劃分Web、Service、DAO
服務化
服務化演進: 進程內服務-單機遠程服務-集群手動注冊服務-自動注冊和發現服務-服務的分組、隔離、路由-服務治理
考慮服務分組、隔離、限流、黑白名單、超時、重試機制、路由、故障補償等
實踐:利用Nginx、HaProxy、LVS等實現負載均衡,ZooKeeper、Consul等實現自動注冊和發現服
消息隊列
目的: 服務解耦(一對多消費)、非同步處理、流量削峰緩沖等
大流量緩沖: 犧牲強一致性,保證最終一致性(案例:庫存扣減,現在Redis中做扣減,記錄扣減日誌,通過後台進程將扣減日誌應用到DB)
數據校對: 解決非同步消息機制下消息丟失問題
數據異構
數據異構: 通過消息隊列機制接收數據變更,原子化存儲
數據閉環: 屏蔽多從數據來源,將數據異構存儲,形成閉環
緩存銀彈
用戶層:
DNS緩存
瀏覽器DNS緩存
操作系統DNS緩存
本地DNS服務商緩存
DNS伺服器緩存
客戶端緩存
瀏覽器緩存(Expires、Cache-Control、Last-Modified、Etag)
App客戶緩存(js/css/image…)
代理層:
CDN緩存(一般基於ATS、Varnish、Nginx、Squid等構建,邊緣節點-二級節點-中心節點-源站)
接入層:
Opcache: 緩存php的Opcodes
Proxy_cache: 代理緩存,可以存儲到/dev/shm或者SSD
FastCGI Cache
Nginx+Lua+Redis: 業務數據緩存
Nginx為例:
PHP為例:
應用層:
頁面靜態化
業務數據緩存(Redis/Memcached/本地文件等)
消息隊列
數據層:
NoSQL: Redis、Memcache、SSDB等
MySQL: Innodb/MyISAM等Query Cache、Key Cache、Innodb Buffer Size等
系統層:
CPU : L1/L2/L3 Cache/NUMA
內存
磁碟:磁碟本身緩存、dirtyratio/dirtybackground_ratio、陣列卡本身緩存
並發化
2.高可用原則
降級
降級開關集中化管理:將開關配置信息推送到各個應用
可降級的多級讀服務:如服務調用降級為只讀本地緩存
開關前置化:如Nginx+lua(OpenResty)配置降級策略,引流流量;可基於此做灰度策略
業務降級:高並發下,保證核心功能,次要功能可由同步改為非同步策略或屏蔽功能
限流
目的: 防止惡意請求攻擊或超出系統峰值
實踐:
惡意請求流量只訪問到Cache
穿透後端應用的流量使用Nginx的limit處理
惡意IP使用Nginx Deny策略或者iptables拒絕
切流量
目的:屏蔽故障機器
實踐:
DNS: 更改域名解析入口,如DNSPOD可以添加備用IP,正常IP故障時,會自主切換到備用地址;生效實踐較慢
HttpDNS: 為了繞過運營商LocalDNS實現的精準流量調度
LVS/HaProxy/Nginx: 摘除故障節點
可回滾
發布版本失敗時可隨時快速回退到上一個穩定版本
3.業務設計原則
防重設計
冪等設計
流程定義
狀態與狀態機
後台系統操作可反饋
後台系統審批化
文檔注釋
備份
4.總結
先行規劃和設計時有必要的,要對現有問題有方案,對未來有預案;欠下的技術債,遲早都是要還的。
本文作者為網易高級運維工程師

I. 商品詳情頁局部靜態化實例分析以及技術點

流程簡述:
1.商品後台進行商品導入,導入後發非同步消息流生成局部靜態模板頁(圖文詳情介紹說明之類的----變化不大的內容)。

2.模板頁的生成,可以利用ob緩存渲染html模板之類的,然後將模板文件上傳到指定的伺服器,這里對文件名的規則有一定的要求( https://image-shop.chuchujie.com/culiu.cdn/shop_staticHtml/detail/18/67/1100240643278_detail.html ),基於商品id進行hash運算得到的/18/67目錄,所有調用端保持一致即可。

3.上傳到七牛伺服器需要注意的地方,七牛開啟cdn加速,在多個地區開啟多個節點,將文件上傳到源站進行分發,除了源站外的其他地方直接訪問的是cdn緩存,如果源站發生改變,需要主動提交刷新緩存請求或者通過攜帶隨機 URL 參數刷新。這里使用通過攜帶隨機 URL 參數刷新。

例如,如果 http://om9helk.qnssl.com/resource/gogopher.jpg 這個圖片資源沒有更新,可以在該 URL 後面加上問號隨機參數的形式來讓 CDN 強制刷新: http://om9helk.qnssl.com/resource/gogopher.jpg?v=1234567 ,CDN 拿到這個 URL 後會強制回源站中取回最新的資源。

如果域名沒有開啟忽略 URL 參數,那麼在 CDN 節點上,對於:
( http://om9helk.qnssl.com/resource/gogopher.jpg )
( http://om9helk.qnssl.com/resource/gogopher.jpg?v=1 )
( http://om9helk.qnssl.com/resource/gogopher.jpg?v=2 )
這三個 URL 是獨立緩存的。所以,如果攜帶之前沒用過的參數訪問,CDN 會強制回源站中取回最新的資源。

① 關閉忽略 URL 緩存的域名,才可以使用這種方法刷新。

本項目中採用nginx緩存一段時間的方法,來控制url的參數 https://image-shop.chuchujie.com/culiu.cdn/shop_staticHtml/detail/18/67/1100240643278_detail.html?v=15484108912&is_cct=0&is_oversea=0&delivery_type=0
參數v通過訪問介面的時間戳來變化,來強制CDN更新。
還有一種好的方法是,更新模板的時候,主動提交刷新緩存請求,來使CDN更新所有緩存內容和源站同步。

4.然後是商品詳情頁介面,裡面有需要的動態變化的數據,例如價格數量 sku,spu,活動時間以及優惠券等信息,也包含局部靜態模板文件地址,ios/安卓可以拿到相應的地址開啟web view進行展示,h5拿到地址進行get請求得到模板html,然後載入到商品詳情頁。

5.商品詳情頁介面里分多級緩存,這里使用memcache。然後使用nginx的fastcgi_cache緩存整個商品詳情頁介面,減少了nginx與php服務的請求,在高並發的情況下性能極佳。

6.這里需要注意的是更新商品內容時需要更新模板,以及nginx更新fastcgi_cache緩存的內容。(我的想法是,在知道更新了商品內容並且更新了模板後,則刪除之前在nginx緩存該商品詳情介面的內容,重新進行緩存,因為直接修改nginx的緩存比較困難,但是刪除比較方便,直接根據規則刪除對應的文件)

7.主要利用七牛上傳文件,使用裡面的刷新緩存功能來更新模板信息。
使其他的CDN緩存回源更新源站最新的內容然後進行緩存。

8.通過nginx配合lua,對特殊的fastcgi_cache緩存的內容進行實時修改數據,比如商品詳情頁里可能含有活動的倒計時時間,這個倒計時時間需要當前的服務時間與活動結束時間實時比較得到,這時候通過ngx.location.capture發起一個當前緩存頁的請求,如果拿到的是緩存的數據,則將數據進行對應的修改local currentTime = os.time(),最後再response響應,ngx.say(response.body);
ngx.exit(ngx.HTTP_OK)。
當然一些無需變化的數據,直接走fastcgi_cache緩存的數據即可。

熱點內容
美國雲伺服器快還是香港快 發布:2025-02-09 09:34:33 瀏覽:988
怎麼解壓qq文件 發布:2025-02-09 09:18:14 瀏覽:581
安卓最新怎麼調靈敏度更穩 發布:2025-02-09 09:12:44 瀏覽:400
豌豆莢如何用安卓手機下載 發布:2025-02-09 09:11:57 瀏覽:213
吃雞腳本輔助 發布:2025-02-09 09:09:29 瀏覽:6
sessionidpython 發布:2025-02-09 09:08:53 瀏覽:276
華為手機驗證碼和密碼忘了是多少 發布:2025-02-09 08:53:53 瀏覽:799
逆戰筆記哪個配置好玩 發布:2025-02-09 08:53:04 瀏覽:600
怎麼打開電腦雲伺服器 發布:2025-02-09 08:36:01 瀏覽:220
日元對人民幣演算法 發布:2025-02-09 08:35:52 瀏覽:40