到底什么是服務(wù)降級?高并發(fā)系統(tǒng)又該如何落地服務(wù)降級?
從本質(zhì)上講,與流量削峰一樣,服務(wù)降級解決的也是在有限的系統(tǒng)資源下,需要承載超高流量的需求問題。像秒殺系統(tǒng)這種瞬時(shí)超高并發(fā)流量的場景,即使我們對系統(tǒng)做了流控措施,在整場秒殺活動下,如果系統(tǒng)持續(xù)處于高并發(fā)流量的壓力下,秒殺鏈路上部分服務(wù)就可能會出現(xiàn)問題。
所以,除了流控以外,我們對秒殺系統(tǒng)也要增加其他的容錯(cuò)方案。
一、前言
在前面的文章中,我們對秒殺系統(tǒng)進(jìn)行了一系列的優(yōu)化措施。同時(shí),對秒殺系統(tǒng)實(shí)現(xiàn)了分布式流控、單機(jī)限流的流控措施。引入了業(yè)務(wù)網(wǎng)關(guān),能夠在業(yè)務(wù)網(wǎng)關(guān)層面實(shí)現(xiàn)分布式流控和單機(jī)流控。為了盡可能的將流控和數(shù)據(jù)校驗(yàn)前置化,引入了流量網(wǎng)關(guān)。為了進(jìn)一步保證秒殺系統(tǒng)整個(gè)交易鏈路上服務(wù)的穩(wěn)定性,我們還需要對秒殺系統(tǒng)進(jìn)行容錯(cuò)處理,其中,服務(wù)降級就是秒殺系統(tǒng)中非常重要的一環(huán)。
二、本章訴求
講述服務(wù)降級的核心原理與落地實(shí)現(xiàn)方案,不只是秒殺系統(tǒng)適用,任何互聯(lián)網(wǎng)項(xiàng)目甚至傳統(tǒng)IT項(xiàng)目,在系統(tǒng)資源有限的情況下,需要支持高并發(fā)流量訪問。此時(shí),都需要對系統(tǒng)進(jìn)行降級處理,使系統(tǒng)能夠在資源有限的環(huán)境中,平穩(wěn)運(yùn)行。
三、服務(wù)降級
從本質(zhì)上講,與流量削峰一樣,服務(wù)降級解決的也是在有限的系統(tǒng)資源下,需要承載超高流量的需求問題。像秒殺系統(tǒng)這種瞬時(shí)超高并發(fā)流量的場景,即使我們對系統(tǒng)做了流控措施,在整場秒殺活動下,如果系統(tǒng)持續(xù)處于高并發(fā)流量的壓力下,秒殺鏈路上部分服務(wù)就可能會出現(xiàn)問題,所以,除了流控以外,我們對秒殺系統(tǒng)也要增加其他的容錯(cuò)方案。
當(dāng)然,如果你的系統(tǒng)資源充足,或者訪問流量根本不高,此時(shí)可以不考慮服務(wù)降級。反之,如果系統(tǒng)資源有限,并且訪問系統(tǒng)的流量比較高,系統(tǒng)資源不足以支撐這么高的并發(fā)訪問流量時(shí),就需要考慮服務(wù)降級了。
服務(wù)降級一般都是有損的,常見的服務(wù)降級方案有:寫服務(wù)降級、讀服務(wù)降級和精簡系統(tǒng)流程。
四、寫服務(wù)降級
學(xué)到這里,小伙伴們應(yīng)該比較清楚了,在秒殺系統(tǒng)中,不可能是一個(gè)單體系統(tǒng)或者單個(gè)微服務(wù)在運(yùn)行,往往是各個(gè)微服務(wù)組成了整個(gè)秒殺的交易鏈路,此時(shí),就會涉及到多數(shù)據(jù)源的問題。
其實(shí),盡管有數(shù)據(jù)一致性理論和分布式事務(wù)落地方案的指導(dǎo),在多數(shù)據(jù)源場景下,數(shù)據(jù)的強(qiáng)一致性其實(shí)也是比較難以保證的,這不僅僅是分布式事務(wù)在高并發(fā)場景下實(shí)現(xiàn)比較困難,更是由于在高并發(fā)場景下,需要對強(qiáng)一致性和高可用性做出權(quán)衡和取舍。
因此,一般在涉及金融資產(chǎn)類對一致性要求比較高的場景時(shí),才會使用強(qiáng)一致性分布式事務(wù)解決方案,其他場景下,會采用弱一致性或者最終一致性分布式事務(wù)方案來解決數(shù)據(jù)一致性的問題。
在訪問流量不高時(shí),可以將寫請求直接路由到MySQL數(shù)據(jù)庫,再通過Canal監(jiān)聽MySQL數(shù)據(jù)庫BinLog的變化,將變化的數(shù)據(jù)更新到Redis緩存,如圖95-1所示。
圖片
這種設(shè)計(jì)下,緩存與數(shù)據(jù)庫的數(shù)據(jù)就是最終一致的,通過將數(shù)據(jù)庫中的增量變化數(shù)據(jù)同步到緩存中,通過緩存可以抗更高的并發(fā)讀操作。但是,此時(shí)系統(tǒng)的寫操作會受限于數(shù)據(jù)庫磁盤的IO操作。
當(dāng)訪問系統(tǒng)的流量激增時(shí),就需要對寫操作進(jìn)行降級,由先寫MySQL數(shù)據(jù)庫,再同步Redis緩存,降級為先寫Redis緩存,再異步寫MySQL數(shù)據(jù)庫。由Redis的強(qiáng)大讀寫能力來抗更高的并發(fā)流量,如圖95-2所示。
圖片
這里,通過降級寫服務(wù),將寫數(shù)據(jù)庫的操作降級為寫Redis緩存,再異步寫MySQL數(shù)據(jù)庫,但是帶來的影響就是緩存數(shù)據(jù)與數(shù)據(jù)庫數(shù)據(jù)的一致性問題。這種為了追求性能而造成的數(shù)據(jù)一致性問題是比較常見的。我們可以設(shè)計(jì)一個(gè)定時(shí)任務(wù)比對數(shù)據(jù),及時(shí)發(fā)現(xiàn)問題后進(jìn)行修復(fù)。
五、讀服務(wù)降級
在高并發(fā)系統(tǒng)設(shè)計(jì)時(shí),為了提供系統(tǒng)的讀性能,我們往往會設(shè)計(jì)多級緩存,此時(shí),如果系統(tǒng)發(fā)生故障,則能夠及時(shí)降級止損。例如,在系統(tǒng)中,我們?yōu)樽x操作設(shè)計(jì)了JVM內(nèi)存緩存、Redis緩存后,又為系統(tǒng)增加了ES緩存,如圖95-3所示。
圖片
此時(shí),如果Redis緩存出現(xiàn)故障,我們可以快速將讀請求降級到ES上。如果Redis和ES同時(shí)出現(xiàn)了故障(實(shí)際場景下很少會發(fā)生同時(shí)出現(xiàn)故障的情況),我們還可以快速將請求降級到MySQL數(shù)據(jù)庫。
六、精簡系統(tǒng)流程
正常情況下,我們在打開電商平臺的商詳頁時(shí),除了會看到商品的基本信息外,還會看到一些商品的附加屬性信息,比如商品的排行、評價(jià)和推薦,商品的收藏?cái)?shù)量以及當(dāng)前用戶是都收藏過商品。在下單頁面,還會存在使用優(yōu)惠券等等入口。
大家可以想象一下,其實(shí),對于普通商品來說,這些附加信息越豐富越好,它能夠在一定程度上吸引用戶下單促成交易轉(zhuǎn)化。但是,在秒殺業(yè)務(wù)下,這些附加信息就不是越多越好了,秒殺系統(tǒng)要求響應(yīng)迅速,性能高。此時(shí),返回的數(shù)據(jù)越少、交互越少,整個(gè)交易鏈路越短,響應(yīng)越快,用戶的體驗(yàn)就越好。
所以,對于秒殺商品來說,就需要根據(jù)具體的情況確定是否要展示這些附加信息了,如果某個(gè)秒殺商品迅速成為了平臺的爆品,此時(shí)就需要對這種爆款商品進(jìn)行附加信息的降級處理了,這也是對非核心功能的降級。對非核心功能進(jìn)行降級,優(yōu)先保證核心功能的正常運(yùn)行。
七、降級開關(guān)設(shè)計(jì)
無論是寫服務(wù)降級,還是讀服務(wù)降級,亦或是精簡系統(tǒng)流程,我們都可以設(shè)計(jì)一個(gè)降級開關(guān)進(jìn)行降級,通過降級開關(guān)進(jìn)行一鍵降級,可以實(shí)現(xiàn)流量在不同的鏈路之間進(jìn)行切換。具體實(shí)現(xiàn)上,我們可以通過配置中心,對降級開關(guān)進(jìn)行變更,各個(gè)微服務(wù)會訂閱配置中心的配置,然后配置中心將變更的降級開關(guān)狀態(tài)推送到各個(gè)微服務(wù)實(shí)例上,如圖95-4所示。
圖片
可以看到,運(yùn)營人員在配置中心控制臺變更降級開關(guān)狀態(tài)后,配置中心會將開關(guān)的狀態(tài)推送到各個(gè)微服務(wù)實(shí)例上,各個(gè)微服務(wù)實(shí)際就會即時(shí)生效,實(shí)現(xiàn)流量在不同的鏈路之間進(jìn)行切換。
八、總結(jié)
本章,對服務(wù)降級的核心原理和落地方案進(jìn)行了介紹。首先,簡單描述了本章的需求。隨后對服務(wù)降級進(jìn)行了簡要的說明。并對寫服務(wù)降級、讀服務(wù)降級和精簡系統(tǒng)流程進(jìn)行了簡單的說明。最后,簡單介紹了降級開關(guān)的設(shè)計(jì)。
九、寫在最后
在冰河的知識星球除了目前正在熱更的高性能網(wǎng)關(guān)和RPC視頻外,還有其他9個(gè)項(xiàng)目,像DeepSeek大模型、手寫高性能熔斷組件、手寫通用指標(biāo)上報(bào)組件、手寫高性能數(shù)據(jù)庫路由組件、分布式IM即時(shí)通訊系統(tǒng)、Sekill分布式秒殺系統(tǒng)、手寫RPC、簡易商城系統(tǒng)等等,這些項(xiàng)目的需求、方案、架構(gòu)、落地等均來自互聯(lián)網(wǎng)真實(shí)業(yè)務(wù)場景,讓你真正學(xué)到互聯(lián)網(wǎng)大廠的業(yè)務(wù)與技術(shù)落地方案,并將其有效轉(zhuǎn)化為自己的知識儲備。
節(jié)選自:《Seckill秒殺系統(tǒng):第95章:服務(wù)降級核心原理與落地方案》一文,文章鏈接:https://articles.zsxq.com/id_ehf2k7838z4b.html






























