互聯網架構設計:高性能的後端

對於互聯網產品的高性能架構設計通常包括以下幾個大方面:

1)Web瀏覽器高性能設計

2)App客戶端高性能設計

3)高性能的網絡和硬件

4)後臺服務高性能設計

 

後端服務一般指用戶直接看到的遠程服務,涉及到網絡硬件、邏輯計算、通信協議和數據存儲等部分。下面我們將着重介紹高性能後臺服務的設計方法和策略。

1、高性能的網絡和硬件

網絡硬件是提供實現高性能服務的先決條件,如果網絡硬件失敗,再優秀的團隊也是“巧婦難爲無米之炊”。互聯網產品在網絡硬件方面經常需要使用的高性能方案有如下幾種:

1)CDN加速技術。CDN加速將網站的內容緩存在網絡邊緣(離用戶接入網絡最近的地方),然後在用戶訪問網站內容的時候,通過調度系統將用戶的請求路由或者引導到離用戶接入網絡最近或者訪問效果最佳的緩存服務器上,由該緩存服務器爲用戶提供內容服務;相對於直接訪問源站,這種方式縮短了用戶和內容之間的網絡距離,從而達到加速的效果。

2)足夠的帶寬。帶寬應該滿足在網站峯值的情況還能足夠快速的使用,所以網絡帶寬應該大於峯值流量 = 峯值QPS * 平均請求大小。只有在保證帶寬的情況才能實現高性能服務。

3)服務器性能。服務器性能主要從CPU、內存和磁盤三個方面來考慮,CPU核心數量能儘量多點,內存大小最好大一點,利用到磁盤存儲的話SSD會優於機械磁盤。

4)硬件負載均衡設備。對於有條件的團隊可以採購硬件負載均衡設備,加強後臺服務負載均衡的能力,比如F5。

2、後臺服務高性能設計

後臺服務的高性能設計是互聯網產品高性能架構設計中最重要的一環,對服務整體性能起到決定性的作用。我們來看看設計高性能後臺服務的方法:

1)分佈式緩存。

緩存的本質是通過key-value形式的Hash表提升讀寫速度,一般情況是O(1)的讀寫速度。讀寫量比較高,變化量不大的數據比較適合使用緩存。業內比較成熟的分佈式緩存系統有redis/memcache。

一般的緩存設計架構如下:用戶第一次請求應用程序時,通過存儲服務直接讀取數據,然後將數據存儲到緩存系統去,用戶第二次請求的時候就直接從緩存系統讀取,從而提升讀取速度。

對於分佈式緩存系統可以Set化部署,比如商品數據緩存到Set1,用戶數據緩存到Set2,或者一類用戶的數據緩存到Set1,另一類的用戶緩存到Set2,如下圖:

此外,也可以按集羣化部署,每一個緩存服務存儲的數據都是對等的,可以對外提供同等的服務,所以外部請求需要負載均衡到不同有緩存服務器,如下圖:

Set化部署的目的主要在於將不同類型的數據路由到不同的地方,好處就是可以減少不同業務數據的耦合,可以針對不同業務進行不同的優化,從而提升整體性能。集羣式部署的目的在於,提高緩存系統的對外服務能力,上層業務的路由策略簡單靈活,擴縮容比較容易。

2)服務分層

在經典的三層(接入層、邏輯層和存儲層)後臺服務架構中,三層的劃分的原則就是同層次的系統專注處理自己的事情。接入層專注於處理前端和後臺服務的接入連通、安全認證和數據轉發。邏輯層專注於處理不同業務的無狀態邏輯服務。存儲層專注於處理業務數據的存儲。這樣分層的好處在於各個層次能夠依據業務特點專注於自己的事情,提高系統複用性,降低業務間的耦合性。在中小型網站中三層架構的典型實現是Nginx(接入層)、Apache Web(邏輯層)、Mysql/Redis(存儲層)。

3)操作異步化

目前大型系統中普遍消息隊列來將調用異步化,不僅可以提升系統性能還可以提升系統的擴展性。對於大量的數據庫寫請求,對於數據庫的壓力很大,同時也會造成數據庫響應不及時。可以考慮使用消息隊列,數據庫的寫請求可以直接寫入到消息隊列,然後通過多線程或多進程從消息隊列中讀取數據慢慢寫入到數據庫。消息隊列服務器的處理速度會遠遠快於數據庫,所以用戶在寫入操作時會感覺到很快的寫入速度。

此外,消息隊列對於請求不均衡的系統,還具有削峯填谷的作用,將短時間內的高峯請求,逐步平攤到更長的時間裏去,從而避免短時間內大量請求壓跨系統。

4)服務拆分

服務拆分有多種說法,比如大系統小做,分佈式拆分,分層結構以及目前很流行的微服務化。不過服務拆分一般來說有以下原則:

a)高內聚、低耦合: 將耦合性低的業務邏輯劃分爲不同系統,將聚合性高的業務邏輯劃分爲同一個系統。

b)單一職責原則:對於一個層次或者一個模塊應該保持相對單一的職責,專注於自己的服務。

c)故障隔離:不同系統必須相對獨立設計和運行,能夠獨立處理自己的故障,而不至於影響全局。

d)獨立運維和持續交互:對於不同的系統可以隨時迭代更新,而不至於影響其他服務。

對於服務拆分主要有縱向拆分和水平拆分兩種方法。三層架構就是典型的縱向拆分模式,第2)點有所闡述。對於不同的業務模塊,針對業務邏輯和存儲服務可以按水平拆分的方法將拆分爲不同的系統。比如商品系統邏輯層、訂單系統邏輯層、商品系統存儲層、訂單系統存儲層。

5)分佈式集羣化

分佈式集羣化是指將不同的業務用集羣化的方式部署到不同的機器上去,對於每一個業務都具備大規模集羣化的能力,從而提升系統的擴展性和高性能。

對於無狀態化的被調服務A,在基於負載均衡的技術下,可以通過集羣化部署成倍的提升服務性能,比如A1服務的性能是1萬請求每秒,那麼部署3臺A服務機器,那麼A服務的性能就是3萬請求每秒了。

6)代碼優化

對於IO操作的請求可以採用基於狀態機的異步化編程。如下圖的請求需要業務系統調用三個接口才能返回響應數據,當業務系統收到請求時,將給該請求分配一個seqid,該seqid在接口響應中也應該原封返回,然後併發三個IO接口的請求包,將該seqid對應的請求上下文保存到timer中,然後去併發處理其他請求,從而極大的提升系統性能。

此外,高性能的編程模型還有多線程模型、多進程模型、多協程模型和事件驅動模型。

對於數據結構的設計可以採用高效的數據結構,比如典型的key-value緩存系統就是基於hash的基本原理來實現的,hash表的查詢效率是O(1),效率極快。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章