性能優(yōu)化:跨服務(wù)使用分布式緩存的三個思考
最近遇到的幾個項目分別用到了本地環(huán)境和分布式緩存。對于各種類型,我們希望做成設(shè)計標桿,以后不管是業(yè)務(wù)團隊同學自己開發(fā)還是我們架構(gòu)團隊幫助優(yōu)化,都有一套標準的設(shè)計模版。
本文是使用Redis分布式緩存優(yōu)化的項目。
要不要打破服務(wù)化的限制
當時拿到需求的時候有個糾結(jié)點:原來數(shù)據(jù)查詢服務(wù)通過RPC調(diào)用數(shù)據(jù)存儲服務(wù),因為涉及RPC調(diào)用以及查數(shù)據(jù)庫,耗時長。所以希望我們加一層緩存,絕大多數(shù)情況下直接從Redis取數(shù)據(jù)。如下圖所示:
通常的設(shè)計要做服務(wù)化,一個服務(wù)對外提供增刪改查,而緩存這種優(yōu)化應(yīng)該放到服務(wù)內(nèi)部。也就是說數(shù)據(jù)查詢服務(wù)查詢?nèi)匀恍枰ㄟ^API來調(diào)用數(shù)據(jù)存儲服務(wù),存儲服務(wù)做不做緩存,數(shù)據(jù)查詢服務(wù)應(yīng)該是不感知的。如下圖所示。
圖片
而需求方的原始需求會破環(huán)服務(wù)的封裝性。這個矛盾怎樣來解決呢?可以這樣來考慮。作為一個服務(wù),內(nèi)部的數(shù)據(jù)處理,包括存儲、邏輯處理這些是要封裝在內(nèi)部的。但是可以使用策略模式提供靈活的訪問API。RPC調(diào)用是一種訪問方式,redis調(diào)用是另外一種訪問方式。這樣就不算破壞封裝行。如下圖所示:
圖片
數(shù)據(jù)一致性校驗算不算多余?
這個和需求方討論沒有達成一致。這也是為什么我連續(xù)三天都發(fā)文了。我不想破壞文章內(nèi)容在實際實施時原本的先后順序,但這一篇要趕在技術(shù)評審之前發(fā)出來,作為評審前跟需求方討論的一個資料。
這個設(shè)計Redis和MySQL里數(shù)據(jù)各存儲了一份,既然有異構(gòu)的存儲,架構(gòu)團隊這邊認為數(shù)據(jù)一致性校驗是要做的。而需求方認為既然都是消費MQ消息后處理,如果處理的沒有問題就不會發(fā)生數(shù)據(jù)不一致的問題。所以只要有個手動運維補償機制來處理生產(chǎn)故障即可,沒有必要定時巡檢來做數(shù)據(jù)一致性校驗。
我一直遵從的理念是對于負責的服務(wù)或者功能,要做到:可觀測、可衡量、可應(yīng)對。自己開發(fā)的功能模塊是正確的,怎樣衡量呢?
數(shù)據(jù)一致性檢查就是用來衡量正確性的。如果邏輯沒有漏洞,數(shù)據(jù)一致性檢查應(yīng)該每次巡檢對比數(shù)據(jù)都是一致的。一旦出現(xiàn)不一致,就是邏輯上出問題了,都是需要case by case分析并做邏輯的修改或者補充的。
如果邏輯本來就簡單,跑了一年都沒有檢查出任何的數(shù)據(jù)不一致,這個檢查是不是浪費呢?服務(wù)和功能都是要演進的,要做變更。變更要做到可灰度、可監(jiān)控、可應(yīng)急。數(shù)據(jù)一致性檢查就是監(jiān)控變更后邏輯正確性的手段。
總結(jié)來說:這個數(shù)據(jù)一致性校驗屬于業(yè)務(wù)巡檢的一項,是用來發(fā)現(xiàn)問題的。發(fā)現(xiàn)問題可以通過在設(shè)計、開發(fā)階段做嚴格的設(shè)計審查、代碼Review來避免一部分。通過邏輯來保證是否屬于過度設(shè)計?需求方對這個邏輯到底有哪些顧慮呢?
巡檢邏輯會不會增加業(yè)務(wù)的復雜性、對數(shù)據(jù)庫造成額外的壓力?
這個巡檢邏輯我們打算通過分布式調(diào)度任務(wù)來做。通過分布式調(diào)度平臺,可以手動觸發(fā)執(zhí)行任務(wù)作為上線時初始化數(shù)據(jù)的手段,同時也是故障處理的應(yīng)急預案,本來就是要做的,做成巡檢只是每天定時執(zhí)行一次,不會增加業(yè)務(wù)的復雜性。
對數(shù)據(jù)庫的壓力方面,這個巡檢的確需要掃描數(shù)據(jù)庫。但是我們會通過控制分頁,采用>id,利用索引等手段來優(yōu)化深度分頁,并且會通過觀察生產(chǎn)監(jiān)控挑選低峰期執(zhí)行,因為這是讀數(shù)據(jù),不會加互斥鎖,表的數(shù)據(jù)量也不大,預計對數(shù)據(jù)庫的壓力可以忽略不計。
總結(jié)
我自己在溝通過程中犯了一個很嚴重的錯誤。在論證數(shù)據(jù)一致性巡檢有必要做的時候,我說:「業(yè)界都是這么做的?!刮抑按_實是調(diào)研過各個做的比較好的大廠,他們對于業(yè)務(wù)巡檢都非常重視。但是我的表達犯了在《批判性思維》這本書中介紹的「篤信權(quán)威」的錯誤。
更正確的處理方式是要從:優(yōu)勢、劣勢、必要性、成本等角度來考慮。更要主動詢問需求方的顧慮。