我堅(jiān)決反對(duì),通過緩存?zhèn)鬟f數(shù)據(jù)!
朋友說他有一個(gè)巧妙架構(gòu)方案,服務(wù)之間通過緩存?zhèn)鬟f數(shù)據(jù):

如上圖:
- service-A將數(shù)據(jù)放入cache;
- service-B從cache里讀取數(shù)據(jù);
朋友問我,這種架構(gòu)設(shè)計(jì)好還是不好?
我旗幟鮮明的反對(duì)“服務(wù)之間通過緩存?zhèn)鬟f數(shù)據(jù)”,下面三種場(chǎng)景,這種設(shè)計(jì)都不適合。
場(chǎng)景一:數(shù)據(jù)管道場(chǎng)景,MQ比cache更加適合。
如果只是單純的將cache作為兩個(gè)服務(wù)數(shù)據(jù)通訊的管道,service-A生產(chǎn)數(shù)據(jù),service-B(當(dāng)然,可能有service-C/service-D等)訂閱數(shù)據(jù),MQ比cache更加合適:
- MQ是互聯(lián)網(wǎng)常見的邏輯解耦,物理解耦組件,支持1對(duì)1,1對(duì)多各種模式,非常成熟的數(shù)據(jù)通道;
- 而cache反而會(huì)將service-A/B/C/D耦合在一起,大家要彼此協(xié)同約定key的格式,ip地址等;
- MQ能夠支持push,而cache只能拉取,不實(shí)時(shí),有時(shí)延;
- MQ能支持?jǐn)?shù)據(jù)落地,cache具備將數(shù)據(jù)存在內(nèi)存里,具有“易失”性,當(dāng)然,有些cache支持落地,但互聯(lián)網(wǎng)技術(shù)選型的原則是,讓專業(yè)的軟件干專業(yè)的事情:nginx做反向代理,db做固化,cache做緩存,mq做通道;

綜上,數(shù)據(jù)管道場(chǎng)景,MQ比cache更加適合。
場(chǎng)景二:數(shù)據(jù)共管場(chǎng)景,兩個(gè)(多個(gè))service同時(shí)讀寫一個(gè)cache實(shí)例會(huì)導(dǎo)致耦合。

如果不是數(shù)據(jù)管道,是兩個(gè)(多個(gè))service對(duì)一個(gè)cache進(jìn)行數(shù)據(jù)共管,同時(shí)讀寫,也是不推薦的,這些service會(huì)因?yàn)檫@個(gè)cache耦合在一起:
- 大家要彼此協(xié)同約定key的格式,ip地址等,耦合;
- 約定好同一個(gè)key,可能會(huì)產(chǎn)生數(shù)據(jù)覆蓋,導(dǎo)致數(shù)據(jù)不一致;
- 不同服務(wù)業(yè)務(wù)模式,數(shù)據(jù)量,并發(fā)量不一樣,會(huì)因?yàn)橐粋€(gè)cache相互影響;
例如:
service-A數(shù)據(jù)量大,占用了cache的絕大部分內(nèi)存,會(huì)導(dǎo)致service-B的熱數(shù)據(jù)全部被擠出cache,導(dǎo)致cache失效。
又例如:
service-A并發(fā)量高,占用了cache的絕大部分連接,會(huì)導(dǎo)致service-B拿不到cache的連接,從而服務(wù)異常。

綜上,數(shù)據(jù)共管場(chǎng)景,多個(gè)service耦合在一個(gè)cache實(shí)例里,也是不推薦的,需要垂直拆分,實(shí)例解耦。
場(chǎng)景三:數(shù)據(jù)訪問場(chǎng)景,兩個(gè)(多個(gè))service有讀寫一份數(shù)據(jù)的需求。

根據(jù)服務(wù)化的原則,數(shù)據(jù)是私有的(本質(zhì)也是解耦):
- service層會(huì)向數(shù)據(jù)的需求方屏蔽下層存儲(chǔ)引擎,分庫,chace的復(fù)雜性;
- 任何需求方不能繞過service讀寫其后端的數(shù)據(jù);

假設(shè)有其他service要有數(shù)據(jù)獲取的需求,應(yīng)該通過service提供的RPC接口來訪問,而不是直接讀寫后端的數(shù)據(jù),無論是cache還是db。
簡(jiǎn)單總結(jié)
不管哪種場(chǎng)景,服務(wù)之間都不要使用緩存來傳遞數(shù)據(jù):
- 數(shù)據(jù)管道場(chǎng)景:MQ比cache更合適;
- 數(shù)據(jù)共管場(chǎng)景:多個(gè)服務(wù)不應(yīng)該共用一個(gè)cache實(shí)例,應(yīng)該垂直拆分解耦;
- 數(shù)據(jù)訪問場(chǎng)景:服務(wù)化架構(gòu),不應(yīng)該繞過service讀取其后端的cache/db,而應(yīng)該通過RPC接口訪問;
知其然,知其所以然。
思路比結(jié)論更重要。




















