1. 高并發(fā)原則1.1 無(wú)狀態(tài)如果應(yīng)用的設(shè)計(jì)是無(wú)狀態(tài)的,那么應(yīng)用比較容易進(jìn)行水平擴(kuò)展。實(shí)際生產(chǎn)環(huán)境是:應(yīng)用無(wú)狀態(tài)、配置文件有狀態(tài)。 1.2 拆分訪問(wèn)量大,資源充足,可考慮拆分。幾種主要的拆分情況:
1.3 服務(wù)化進(jìn)程內(nèi)服務(wù)—>單機(jī)遠(yuǎn)程服務(wù)—>集群手動(dòng)注冊(cè)服務(wù)—>自動(dòng)注冊(cè)和發(fā)現(xiàn)服務(wù)—>服務(wù)的分組/隔離/路由—>服務(wù)治理(限流/黑白名單) 1.4 消息隊(duì)列消息隊(duì)列用來(lái)解耦一些不需要同步調(diào)用的服務(wù),或者訂閱一些自己系統(tǒng)關(guān)心的變化。使用消息隊(duì)列可以實(shí)現(xiàn)服務(wù)解耦(一對(duì)多消費(fèi))、異步處理、流量削峰/緩沖等。 1.5 數(shù)據(jù)異構(gòu)1.5.1 數(shù)據(jù)異構(gòu) 訂單分庫(kù)分表一般按照訂單ID進(jìn)行拆分,如果要查詢某個(gè)用戶的訂單列表,則需要聚合多個(gè)表的數(shù)據(jù)后才能返回,這樣會(huì)導(dǎo)致訂單表的讀性能很低。此時(shí)需要對(duì)訂單表進(jìn)行異構(gòu),異構(gòu)一套用戶訂單表,按照用戶ID進(jìn)行分庫(kù)分表。 另外,還需要考慮對(duì)訂單數(shù)據(jù)進(jìn)行歸檔處理,以提升服務(wù)的性能和穩(wěn)定性。 1.5.2 數(shù)據(jù)閉環(huán) 如商品詳情頁(yè),因?yàn)閿?shù)據(jù)來(lái)源太多,影響服務(wù)穩(wěn)定性的因素就非常多。因此,最好的辦法就是把使用到的數(shù)據(jù)進(jìn)行異構(gòu)存儲(chǔ),形成數(shù)據(jù)閉環(huán),基本步驟如下:
這種方式的好處是數(shù)據(jù)閉環(huán),任何依賴系統(tǒng)出問(wèn)題了,還是能正常工作,只是更新會(huì)有積壓,但是不影響前端展示。 另外,如果一次需要多個(gè)數(shù)據(jù),那么可以考慮使用HashTag機(jī)制把相關(guān)的數(shù)據(jù)聚合到一個(gè)實(shí)例,如在展示商品詳情頁(yè)時(shí)需要使用商品基本信息”p:productId:”和商品規(guī)格參數(shù)信息”d:productId:”,此時(shí)就可以使用冒號(hào)中間的productId作為數(shù)據(jù)分片的Key,這樣相同productId的商品相關(guān)數(shù)據(jù)就在同一個(gè)實(shí)例。 1.6 緩存銀彈
對(duì)于兜底數(shù)據(jù)或者異常數(shù)據(jù),不應(yīng)該讓其緩存,否則用戶會(huì)在很長(zhǎng)一段時(shí)間里看到這些數(shù)據(jù)。 1.7 并發(fā)化改串行為并行。 2. 高可用原則 2.1 降級(jí)對(duì)于高可用服務(wù),很重要的一個(gè)設(shè)計(jì)就是降級(jí)開(kāi)關(guān),在設(shè)計(jì)降級(jí)開(kāi)關(guān)時(shí),主要依據(jù)如下思路: 1. 開(kāi)關(guān)集中化管理:通過(guò)推送機(jī)制把開(kāi)關(guān)推送到各個(gè)應(yīng)用。 2. 可降級(jí)的多級(jí)讀服務(wù):比如服務(wù)調(diào)用降級(jí)為只讀本地緩存、只讀分布式緩存、只讀默認(rèn)降級(jí)數(shù)據(jù)(如庫(kù)存狀態(tài)默認(rèn)有貨)。 3. 開(kāi)關(guān)前置化:如架構(gòu)是Nginx–>tomcat,可以將開(kāi)關(guān)前置到Nginx接入層,在Nginx層做開(kāi)關(guān),請(qǐng)求流量回源后端應(yīng)用或者只是一小部分流量回源。 4. 業(yè)務(wù)降級(jí):當(dāng)高并發(fā)流量來(lái)襲,在電商系統(tǒng)大促設(shè)計(jì)時(shí)保障用戶能下單、能支付是核心要求,并保障數(shù)據(jù)最終一致性即可。這樣就可以把一些同步調(diào)用改成異步調(diào)用,優(yōu)先處理高優(yōu)先級(jí)數(shù)據(jù)或特殊特征的數(shù)據(jù),合理分配進(jìn)入系統(tǒng)的流量,以保障系統(tǒng)可用。 2.2 限流限流的目的是防止惡意請(qǐng)求流量、惡意攻擊,或者放置流量超出系統(tǒng)峰值??梢钥紤]如下思路: 1. 惡意請(qǐng)求流量只訪問(wèn)到cache。 2. 對(duì)于穿透到后端應(yīng)用的流量可以考慮使用Ningx的limit模塊處理。 3. 對(duì)于惡意IP可以使用nginx deny進(jìn)行屏蔽。 原則是限制流量穿透到后端薄弱的應(yīng)用層。 2.3 切流量對(duì)于一個(gè)大型應(yīng)用,切流量是非常重要的,比如多機(jī)房環(huán)境下某個(gè)機(jī)房掛了,或者某個(gè)機(jī)架掛了,或者某臺(tái)服務(wù)器掛了,都需要切流量,可以使用如下手段進(jìn)行切換: 1. DNS 2. HttpDNS 3. LVS/HaProxy 4. Nginx 2.4 可回滾版本化的目的是實(shí)現(xiàn)可審計(jì)、可追溯,并且可回滾。當(dāng)程序或者數(shù)據(jù)出錯(cuò),如果有版本化機(jī)制,那么久可以通過(guò)回滾恢復(fù)到最近一個(gè)正確的版本,比如事務(wù)回滾、代碼庫(kù)回滾、部署版本回滾、數(shù)據(jù)版本回滾、靜態(tài)資源版本回滾等。通過(guò)回滾機(jī)制可以保證系統(tǒng)在某些場(chǎng)景下的高可用。 3. 業(yè)務(wù)設(shè)計(jì)原則3.1 防重設(shè)計(jì)例如防止重復(fù)支付、重復(fù)扣減內(nèi)存等。 3.2 冪等設(shè)計(jì)一個(gè)冪等操作的特點(diǎn)是其任意多次執(zhí)行所產(chǎn)生的影響均與一次執(zhí)行的影響相同。冪等函數(shù)或冪等方法,是指可以使用相同參數(shù)重復(fù)執(zhí)行,并能獲得相同結(jié)果的函數(shù)。 3.3 流程可定義復(fù)用流程系統(tǒng),提供個(gè)性化的流程服務(wù)。 3.4 狀態(tài)與狀態(tài)機(jī)在設(shè)計(jì)交易訂單系統(tǒng)時(shí),會(huì)存在正向狀態(tài)(待付款、待發(fā)貨、已發(fā)貨、完成)和逆向狀態(tài)(取消、退款)等,正向狀態(tài)和逆向狀態(tài)應(yīng)該根據(jù)系統(tǒng)的特征來(lái)決定要不要分離存儲(chǔ)。狀態(tài)設(shè)計(jì)時(shí)應(yīng)有狀態(tài)軌跡,方便用戶跟蹤當(dāng)前訂單的軌跡并記錄相關(guān)日志,萬(wàn)一出問(wèn)題時(shí)可回溯問(wèn)題。 3.5 后臺(tái)系統(tǒng)操作可反饋設(shè)計(jì)后臺(tái)系統(tǒng)時(shí),考慮效果的可預(yù)覽、可反饋。 3.6 后臺(tái)系統(tǒng)審批化對(duì)于有些重要的后臺(tái)功能需要設(shè)計(jì)審批流,比如調(diào)整價(jià)格,并對(duì)操作進(jìn)行日志記錄,從而保證操作可追溯、可審計(jì)。 3.7 文檔和注釋系統(tǒng)發(fā)展的最初階段就應(yīng)該有文檔庫(kù)(設(shè)計(jì)架構(gòu)、設(shè)計(jì)思想、數(shù)據(jù)字典/業(yè)務(wù)流程、現(xiàn)有問(wèn)題),業(yè)務(wù)代碼合特殊需求都要有注釋。 3.8 備份包括代碼和人員的備份。代碼主要提交到代碼倉(cāng)庫(kù)進(jìn)行管理和備份,代碼倉(cāng)庫(kù)至少應(yīng)該具備多版本的功能。人員備份指的是一個(gè)系統(tǒng)至少應(yīng)該有兩名開(kāi)發(fā)人員是了解的。 4. 總結(jié)系統(tǒng)設(shè)計(jì)不僅需要考慮實(shí)現(xiàn)業(yè)務(wù)功能,還要保證系統(tǒng)高并發(fā)、高可用、高可靠等。同時(shí)還應(yīng)考慮系統(tǒng)容量規(guī)劃(流量、容量等)、SLA指定(吞吐量、響應(yīng)時(shí)間、可用性、降級(jí)方案等)、監(jiān)控報(bào)警(機(jī)器負(fù)載、響應(yīng)時(shí)間、可用率等)、應(yīng)急預(yù)案(容災(zāi)、降級(jí)、限流、隔離、切流量、可回滾等)。 4.1 高并發(fā)原則1. 緩存 2. 異步并發(fā) 3. 連接池 4. 線程池 5. 擴(kuò)容 6. 消息隊(duì)列 7. 分布式任務(wù) 4.2 高可用原則1. 通過(guò)負(fù)載均衡和反向代理實(shí)現(xiàn)分流。 2. 通過(guò)限流保護(hù)服務(wù)免受雪崩之災(zāi)。 3. 通過(guò)降級(jí)實(shí)現(xiàn)部分可用、有損服務(wù)。 4. 通過(guò)隔離實(shí)現(xiàn)故障隔離。 5. 通過(guò)合理設(shè)置的超時(shí)與重試機(jī)制避免請(qǐng)求堆積造成雪崩。 6. 通過(guò)回滾機(jī)制快速修復(fù)錯(cuò)誤版本。 參考來(lái)源: [1] 億級(jí)流量網(wǎng)站架構(gòu)核心技術(shù).張開(kāi)濤著 |
|
|