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