緩存可以以低成本提供可用性和延遲方面的直接好處。但是,如果忽略我們上面討論的方面,則在緩存發(fā)生故障時(shí)可能會暴露隱藏的擴(kuò)展瓶頸,從而可能導(dǎo)致系統(tǒng)故障。定期檢查以確保系統(tǒng)在緩存發(fā)生故障時(shí)也能正常運(yùn)行,這對于防止可能影響系統(tǒng)可靠性的災(zāi)難性中斷至關(guān)重要。
當(dāng)我們考慮改善依賴服務(wù)調(diào)用的延遲和可用性特性時(shí),緩存通常被用作一種通用解決方案。由于我們避免了對依賴服務(wù)進(jìn)行網(wǎng)絡(luò)往返,因此延遲有所改善;由于緩存提供了我們所需的響應(yīng),我們無需擔(dān)心依賴服務(wù)的臨時(shí)停機(jī),因此可用性有所改善。需要注意的是,如果我們對依賴服務(wù)的請求每次都導(dǎo)致不同的響應(yīng),或者客戶端發(fā)出的請求類型截然不同且響應(yīng)之間沒有太多重疊,則緩存無濟(jì)于事。如果我們的服務(wù)無法容忍陳舊數(shù)據(jù),那么使用緩存還會受到其他限制。
我們不會深入探討緩存類型、技術(shù)和適用性,因?yàn)檫@些內(nèi)容在互聯(lián)網(wǎng)上已經(jīng)廣泛介紹過了。相反,我們將重點(diǎn)討論緩存中較少被提及的風(fēng)險(xiǎn),這些風(fēng)險(xiǎn)在系統(tǒng)發(fā)展過程中被忽視,而這會使系統(tǒng)面臨大面積中斷的風(fēng)險(xiǎn)。
何時(shí)使用緩存
在許多情況下,部署緩存是為了掩蓋依賴服務(wù)的已知擴(kuò)展瓶頸,或者緩存接管這一角色,以隱藏依賴服務(wù)隨著時(shí)間的推移可能出現(xiàn)的擴(kuò)展缺陷。例如,當(dāng)我們的服務(wù)開始減少對依賴服務(wù)的調(diào)用時(shí),他們開始相信這是穩(wěn)定狀態(tài)流量的常態(tài)。如果我們的緩存命中率為 90%,這意味著對依賴服務(wù)的 9/10 次調(diào)用都由緩存提供,那么依賴服務(wù)只能看到 10% 的實(shí)際流量。如果客戶端緩存由于中斷或錯(cuò)誤而停止工作,依賴服務(wù)的流量將激增 9 倍!在幾乎所有情況下,這種流量激增都會使依賴服務(wù)過載,從而導(dǎo)致中斷。如果依賴服務(wù)是數(shù)據(jù)存儲,這將導(dǎo)致依賴該數(shù)據(jù)存儲的多個(gè)其他服務(wù)癱瘓。
為了防止此類中斷,客戶端和服務(wù)都應(yīng)考慮遵循建議來保護(hù)他們的系統(tǒng)。
建議
對于客戶端來說,重要的是不要再將緩存視為“可有可無”的優(yōu)化,而是將其視為需要與常規(guī)服務(wù)一樣對待和審查的關(guān)鍵組件。這包括對緩存命中率閾值以及發(fā)送到依賴服務(wù)的整體流量進(jìn)行監(jiān)控和報(bào)警。
對緩存業(yè)務(wù)邏輯的任何更新或更改也需要在開發(fā)環(huán)境和預(yù)生產(chǎn)階段經(jīng)過同樣嚴(yán)格的測試。部署到參與緩存的服務(wù)器時(shí),應(yīng)確保存儲的狀態(tài)已轉(zhuǎn)移到部署后即將啟動(dòng)的新服務(wù)器,或者部署期間緩存命中率的下降對于依賴服務(wù)來說是可以容忍的。如果在部署期間關(guān)閉大量緩存服務(wù)服務(wù)器,則可能導(dǎo)致緩存命中率成比例下降,從而給依賴服務(wù)帶來壓力。
客戶端還需要實(shí)施防護(hù)措施來控制流向依賴項(xiàng)服務(wù)的整體流量(以每服務(wù)事務(wù)數(shù) (TPS) 來衡量)。當(dāng)緩存隊(duì)列出現(xiàn)故障時(shí),令牌桶等算法可以幫助限制來自隊(duì)列的 TPS。這需要通過關(guān)閉緩存實(shí)例并查看客戶端如何向依賴項(xiàng)服務(wù)發(fā)送流量來定期進(jìn)行測試。客戶端還應(yīng)考慮實(shí)施具有較小生存時(shí)間 (TTL) 的負(fù)緩存策略。負(fù)緩存意味著客戶端將存儲來自依賴項(xiàng)服務(wù)的錯(cuò)誤響應(yīng),以確保依賴項(xiàng)服務(wù)在長時(shí)間中斷時(shí)不會受到重試請求的轟炸。
同樣,在服務(wù)端,需要實(shí)施負(fù)載削減機(jī)制來防止服務(wù)過載。在這種情況下,過載意味著服務(wù)無法在客戶端超時(shí)內(nèi)做出響應(yīng)。請注意,隨著服務(wù)負(fù)載的增加,通常表現(xiàn)為延遲增加,因?yàn)榉?wù)器資源被過度使用,導(dǎo)致響應(yīng)速度變慢。我們希望在客戶端請求超時(shí)之前做出響應(yīng),如果總體延遲開始超過客戶端超時(shí),則開始拒絕請求。
有多種技術(shù)可以防止過載;最簡單的技術(shù)之一是限制從應(yīng)用程序負(fù)載均衡器 ( ALB ) 到服務(wù)主機(jī)的連接數(shù)。但是,這可能意味著不加區(qū)分地丟棄請求,如果不希望這樣,則可以在服務(wù)的應(yīng)用程序?qū)訉?shí)施優(yōu)先級技術(shù)以丟棄不太重要的請求。負(fù)載削減的目標(biāo)是確保服務(wù)在服務(wù)的整體負(fù)載增加時(shí)保護(hù)有效吞吐量,即在客戶端超時(shí)內(nèi)提供的請求。服務(wù)還需要定期運(yùn)行負(fù)載測試以驗(yàn)證服務(wù)主機(jī)處理的最大 TPS,這允許對 ALB 連接限制進(jìn)行微調(diào)。我們介紹了幾種保護(hù)服務(wù)有效吞吐量的技術(shù),這些技術(shù)應(yīng)該可以廣泛應(yīng)用,但讀者可以根據(jù)自己的服務(wù)需求探索更多方法。
結(jié)論
緩存可以以低成本提供可用性和延遲方面的直接好處。但是,如果忽略我們上面討論的方面,則在緩存發(fā)生故障時(shí)可能會暴露隱藏的擴(kuò)展瓶頸,從而可能導(dǎo)致系統(tǒng)故障。定期檢查以確保系統(tǒng)在緩存發(fā)生故障時(shí)也能正常運(yùn)行,這對于防止可能影響系統(tǒng)可靠性的災(zāi)難性中斷至關(guān)重要。
路由網(wǎng)(www.lu-you.com)您可以查閱其它相關(guān)文章!