albian开发笔记五--谈缓存同步
?? ? ?今天我在weibo上發(fā)布了albian將放棄支持緩存同步后,引起了以前的伙計(jì)們一片的談?wù)撀?。有認(rèn)為緩存同步不是一項(xiàng)好的解決方案的、也有認(rèn)為沒有緩存同步將無法使用本地緩存的、還有擔(dān)憂一臺(tái)機(jī)器的本地緩存各自為政導(dǎo)致全站緩存狀態(tài)錯(cuò)亂的......,但是很不幸,albian還是決定不支持本地緩存的同步。
?? ? ?緩存:主要的目的是用來為了讓客戶得到更高的響應(yīng)。這是沒有錯(cuò)的。但是從架構(gòu)人員來說,當(dāng)你考慮使用一種方案來實(shí)現(xiàn)某一目的時(shí),你不能只從一點(diǎn)看,約束條件有很多。比如金錢投入、擴(kuò)展性(這個(gè)很重要)等等。
?? ? ?緩存從架構(gòu)上分,又有本地和分布式之分。本地緩存一般存儲(chǔ)在提供服務(wù)的機(jī)器上,最大的優(yōu)點(diǎn)就是進(jìn)車內(nèi)通訊,得到數(shù)據(jù)幾乎沒有時(shí)間差;分布式緩存從名字上就能知道緩存是分布在不同的機(jī)器上的,目前業(yè)界比較流行的做法是使用memcached或者類似的軟件,它的優(yōu)點(diǎn)就是可以線性接近無限的擴(kuò)展,而且保證存取緩存數(shù)據(jù)時(shí)不會(huì)因?yàn)閿?shù)據(jù)量的增大而損耗性能。然后是缺點(diǎn):本地緩存最大的問題是擴(kuò)展性:表現(xiàn)在幾個(gè)方面:緩存的狀態(tài)更新怎么辦?緩存的大小限制,等等。分布式緩存的最大問題可能就是一臺(tái)服務(wù)down數(shù)據(jù)庫壓力劇增時(shí)怎么辦?頻繁操作分布式緩存性能怎么樣?等等。
?? ? ?先說本地緩存。支持使用本地緩存的XT基本上是為了效率出發(fā),因?yàn)楸镜鼐彺娴拇嫒』旧喜恍枰紤]時(shí)間消耗,所以用起來非常爽。如果你只有10臺(tái)之內(nèi)的服務(wù)器,這個(gè)架構(gòu)基本上沒有問題。就算是增加上緩存內(nèi)對(duì)象狀態(tài)的考慮(這個(gè)問題就是:如果有2臺(tái)以上的服務(wù)器同時(shí)存了一個(gè)A對(duì)象,當(dāng)?shù)谝慌_(tái)機(jī)器上的A被改變時(shí)怎么讓第二臺(tái)或者第三臺(tái)甚至更多臺(tái)機(jī)器也知道A對(duì)象已經(jīng)被更改了?),問題也不大。我們?cè)黾右粋€(gè)服務(wù),專門用來同步各個(gè)對(duì)象的狀態(tài):架構(gòu)如圖所示:
步驟是這樣的:
?? ? ?1.同步服務(wù)器和業(yè)務(wù)服務(wù)器全部啟動(dòng)起來,業(yè)務(wù)服務(wù)器向同步服務(wù)器注冊(cè),告知同步服務(wù)器業(yè)務(wù)服務(wù)器已經(jīng)準(zhǔn)備完畢;
?? ? ?2.某一機(jī)器上的A對(duì)象被更改了,它會(huì)通過網(wǎng)絡(luò)通知同步服務(wù)器,告訴同步服務(wù)器,A對(duì)象已經(jīng)被更改;
?? ? ?3.同步服務(wù)器的得到了A對(duì)象被更改的消息后,首先從內(nèi)存中得到剛剛注冊(cè)的并且還健在的業(yè)務(wù)服務(wù)器;
?? ? ?4.通知所有的健在業(yè)務(wù)服務(wù)器,A對(duì)象已經(jīng)被更改,你們需要更新;
?? ? ?5.業(yè)務(wù)服務(wù)器得到通知后,啟動(dòng)更新程序,從數(shù)據(jù)庫中獲取最新的A對(duì)象的信息,并且緩存;
同步大概的步驟就是這樣的。問題有以下幾點(diǎn):
?? ? ? 1.延遲。網(wǎng)絡(luò)通訊是需要有時(shí)間的,同步中,至少經(jīng)過了3個(gè)網(wǎng)絡(luò)傳輸步驟,時(shí)間的延遲會(huì)比較長(zhǎng);
?? ? ? 2.擴(kuò)展性不好。我業(yè)務(wù)服務(wù)器少這套機(jī)制還能抗住,一旦我業(yè)務(wù)服務(wù)器多呢?很多人可能會(huì)說,增加同步服務(wù)器,對(duì),就是這個(gè)策略,但是你還要更改業(yè)務(wù)代碼,把不同的對(duì)象按照你的邏輯分發(fā)到不同的同步服務(wù)器,然后再通知業(yè)務(wù)服務(wù)器。但是如果業(yè)務(wù)服務(wù)器有200臺(tái)呢?你一臺(tái)同步服務(wù)器通知200臺(tái)需要多少時(shí)間?
?? ? ? 3.容災(zāi)新不強(qiáng)。如果有一臺(tái)同步服務(wù)器down掉你怎么辦?這個(gè)好像有解決辦法。在同步服務(wù)器集群上套小集群,采用pxois算法,應(yīng)該可以搞定;
?? ? ? 4.每臺(tái)業(yè)務(wù)服務(wù)器都要從數(shù)據(jù)庫中l(wèi)oad一遍同樣的數(shù)據(jù),而且?guī)缀跏窃谕粫r(shí)刻完成,數(shù)據(jù)庫的壓力也會(huì)增加;
?? ? ? 5.業(yè)務(wù)服務(wù)器上占用過多的內(nèi)存浪費(fèi)不說還會(huì)導(dǎo)致我們單機(jī)處理業(yè)務(wù)的量下降。業(yè)務(wù)服務(wù)器最主要的還是處理業(yè)務(wù)請(qǐng)求,假設(shè)一個(gè)進(jìn)程使用2G內(nèi)存可以處理500個(gè)請(qǐng)求,然后本地緩存消耗掉2g,我們一臺(tái)8G的機(jī)器本來可以同時(shí)跑3個(gè)進(jìn)程,現(xiàn)在卻只能跑2個(gè),無形中損耗掉500個(gè)業(yè)務(wù)的處理量;
?? ? ?而如果我們換成分布式的系統(tǒng)架構(gòu),我們的架構(gòu)將會(huì)是這樣子:
步驟如下:
?? ? ?1.程序起來的時(shí)候,需要將需要的數(shù)據(jù)全部沖入緩存;
?? ? ?2.起來業(yè)務(wù)服務(wù)器,什么都不用做;
?? ? ?3.當(dāng)更改一臺(tái)業(yè)務(wù)服務(wù)器上的A對(duì)象時(shí),再更改完后同時(shí)把A對(duì)象更新到分布式緩存集群;
?? ? ?4.當(dāng)另外的業(yè)務(wù)服務(wù)器需要A對(duì)象時(shí),從分布式緩存集群中獲取;
?? ? ?5.重復(fù)3-4;
分布式也有缺點(diǎn):
?? ? ?1.每次讀取都要時(shí)間;這也許是一個(gè)問題。但是目前從測(cè)試的結(jié)果看,10k的數(shù)據(jù)從memcached中獲取時(shí)間為0.4毫秒;
?? ? ?2.如果一臺(tái)緩存服務(wù)器down掉,那么數(shù)據(jù)庫壓力就會(huì)增大,并且可能會(huì)存在需要重新導(dǎo)入數(shù)據(jù)的風(fēng)險(xiǎn);
?? ? ?從目前分析的本地緩存和分布式緩存來看,本地緩存問題比較多,而且最重要的是擴(kuò)展性沒辦法很好的搞定。對(duì)于一個(gè)定位于企業(yè)級(jí)應(yīng)用的架構(gòu)而言,失去了擴(kuò)展性意味著當(dāng)數(shù)據(jù)量上去的時(shí)候,很多事情就束手無策了。所以albian最后還是放棄了同步。
?? ? ?其實(shí)從albian的角度出發(fā),albian的IAlbianObject本身就是為了網(wǎng)絡(luò)傳輸?shù)目紤]而設(shè)計(jì)的,albian推薦使用貧血對(duì)象,業(yè)務(wù)和數(shù)據(jù)結(jié)構(gòu)分開。類似于數(shù)據(jù)就像是水管中的水,而業(yè)務(wù)流程就像水管。水(對(duì)象)從水管進(jìn)口(GUI)流入,經(jīng)過水管(業(yè)務(wù)流程),流向蓄水池(數(shù)據(jù)庫)或者再次回給客戶(回流)。這樣當(dāng)數(shù)據(jù)量上去(水大的時(shí)候)的時(shí)候,我們就可以想水管工那樣在這個(gè)環(huán)節(jié)中增加我們的策略,分流、直接炸掉大壩等等很容易的做出相應(yīng)的應(yīng)對(duì)。
?? ? ?其實(shí)albian不是不推薦不使用本地緩存,albian推薦的緩存使用規(guī)則如下:
?? ? ?1.全站都要使用的緩存就是用分布式緩存;
?? ? ?2.本地緩存肯定要用,但是最好用在過期的對(duì)象上,比如列表的list對(duì)象等等;
?? ? ?3.所有的對(duì)象都應(yīng)該是可序列化和滿足網(wǎng)絡(luò)傳輸?shù)?#xff1b;
?? ? ?4.如果緩存是從分布式緩存集群中獲取的,可以使用會(huì)話內(nèi)緩存(不是session那么簡(jiǎn)單);
?? ? ?
轉(zhuǎn)載于:https://www.cnblogs.com/Seapeak/archive/2011/07/20/2111017.html
總結(jié)
以上是生活随笔為你收集整理的albian开发笔记五--谈缓存同步的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 说说在MVC开发中,遇到的错误及解决方法
- 下一篇: 莫让机遇擦肩而过