小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

交易型系統(tǒng)設(shè)計(jì)的一些原則

 xujin3 2017-10-22

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)量大,資源充足,可考慮拆分。幾種主要的拆分情況:


  • 系統(tǒng)維度:按照系統(tǒng)功能/業(yè)務(wù)拆分。

  • 功能維度:對(duì)一個(gè)系統(tǒng)按照功能拆分。

  • 讀寫維度:根據(jù)讀寫比例特征進(jìn)行拆分。讀的量太大,可用緩存;寫的量太大,可分庫(kù)分表。聚合讀取場(chǎng)景,可考慮數(shù)據(jù)異構(gòu)拆分系統(tǒng),將分散在多處的數(shù)據(jù)聚合到一處存儲(chǔ),以提升系統(tǒng)的性能和可靠性。

  • AOP維度:根據(jù)訪問(wèn)特征,按照AOP進(jìn)行拆分。

  • 模塊維度:按照基礎(chǔ)或者代碼維護(hù)特征進(jì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ù)異構(gòu):通過(guò)MQ機(jī)制接收數(shù)據(jù)變更,然后原子化存儲(chǔ)到合適的存儲(chǔ)引擎,如Redis或者持久化KV存儲(chǔ)。

  • 數(shù)據(jù)聚合:數(shù)據(jù)異構(gòu)的目的是把數(shù)據(jù)從多個(gè)數(shù)據(jù)源拿過(guò)來(lái),數(shù)據(jù)聚合的目的是把這些數(shù)據(jù)做個(gè)聚合,這樣前端就可以通過(guò)一次調(diào)用拿到所有數(shù)據(jù)。此步驟一般存儲(chǔ)在KV中。

  • 前端展示:前端通過(guò)一次或少量幾次調(diào)用就拿到所需要的數(shù)據(jù)。


這種方式的好處是數(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 緩存銀彈


  • 瀏覽器端緩存

  • APP客戶端緩存

  • CDN(Content Delivery Network)緩存

  • 接入層緩存

  • 應(yīng)用層緩存

  • 分布式緩存


對(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)濤著

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多