認真考慮如何存儲會話數(shù)據(jù)可以確保系統(tǒng)能夠持續(xù)擴展。許多Web服務(wù)器或語言都提供了簡單的基于服務(wù)器的會話管理方法,但這些方法通常有一些問題,例如把用戶關(guān)聯(lián)到了特定的服務(wù)器。實現(xiàn)分布式緩存,就可以在系統(tǒng)中存放會話數(shù)據(jù),使系統(tǒng)能夠持續(xù)擴展。
在你得出需要在應(yīng)用或系統(tǒng)中維護狀態(tài),以及確定不能把狀態(tài)存放在最終用戶的瀏覽器上的結(jié)論之前,我們希望你花時間認真考慮一下推薦的流程。你應(yīng)該為此決定感到難過,為自己不能想辦法開發(fā)出無狀態(tài)的系統(tǒng)或者不能讓最終用戶維護狀態(tài)而感到羞愧。
當然,這是在開玩笑,因為我們已經(jīng)承認,的確有些系統(tǒng)必須維護狀態(tài),即便是很少量的狀態(tài),而且這些狀態(tài)最好是在服務(wù)、應(yīng)用或產(chǎn)的基礎(chǔ)設(shè)施中維護。考慮到這一點,我們來討論幾個在應(yīng)用中維護狀態(tài)的原則。
第一,也是最重要的,遠離那些要求關(guān)聯(lián)到一個應(yīng)用或Web服務(wù)器的有狀態(tài)系統(tǒng)。這種實現(xiàn)的可用性比那些可以遠程訪問任何服務(wù)器上的狀態(tài)的實現(xiàn)低。如果關(guān)聯(lián)的服務(wù)器死機了,那么這臺服務(wù)器上的所有會話信息(包括狀態(tài))都會失效,相關(guān)的客戶(很可能是幾千個)就需要重復(fù)他們的操作。即使把數(shù)據(jù)存放在了本地或網(wǎng)絡(luò)存儲上,用戶也需要在另一臺服務(wù)器上從頭來過,而上且這期間還會有服務(wù)中斷。
第二,不要使用狀態(tài)或會話復(fù)制服務(wù),如某些應(yīng)用服務(wù)器或第三方集群服務(wù)器上的服務(wù)。如本章前面所述,這樣的系統(tǒng)不能很好地擴展,因為對會話的修改需要傳播到很多結(jié)點上。因此,選擇這種類類型的實現(xiàn),我們就要關(guān)注為了擴展系統(tǒng)需要使用多少內(nèi)存。
第三,在選擇會話或狀態(tài)緩存或持久引時,要選擇不執(zhí)行真正處理的服務(wù)器上的緩存。雖然這有點挑剔,但的確有助于提高可用性,因為當你丟失了一臺服務(wù)器時,只會丟失與之相關(guān)的緩存,或者只會丟失其上運行的服務(wù),而不會同時丟失兩者。創(chuàng)建一個緩存(或持續(xù))層,也使得我們可以只基于緩存訪問就能進行擴展,而不必再依靠應(yīng)用服務(wù)和內(nèi)部及遠程的緩存服務(wù)了。
采用分布式會話/狀態(tài)緩存不要做哪些事:
下面列出了實現(xiàn)緩存管理會話或狀態(tài)時要避免的三種方法口不要實現(xiàn)要求關(guān)聯(lián)到服務(wù)器的系統(tǒng)。
不要使用狀態(tài)或會話復(fù)制,在不同的系統(tǒng)中創(chuàng)建重復(fù)的數(shù)據(jù)。
不要把緩存放在執(zhí)行操作的系統(tǒng)上(這并不是說不應(yīng)該有本地應(yīng)用緩存,只是說最好把會話信息放在自己的服務(wù)器層上)。
如果你遵守不要做哪些事情的原則,那么選擇需要做哪些事情就容易多了。對于這些題,找們看不可知論的態(tài)度,因此,我們更關(guān)心的是設(shè)計,而不是實現(xiàn)細節(jié),如應(yīng)該采用哪種開源的緩存或數(shù)據(jù)庫解決方案等。我們有一個強烈的感覺,你幾乎不需要自己開發(fā)緩存方案。有了那么多分布式對象緩存選擇,從memcached到開源的或第三方的數(shù)據(jù)庫,如果誰還需要為存放會話信息而實現(xiàn)自己的緩存方案,會顯得很荒謬可笑。
這就帶來了問題,應(yīng)該用什么實現(xiàn)緩存呢?對我們來說,這個問題實際上是在可靠性和持久性與成本之間進行衡量。如果你期望把會話或狀態(tài)信息保存一段時間,如購物車,那么可能會決定采用具有長期可持久性的解決方案存放部分或所有的會話信息。在我們見過的許多實例中,都是采用數(shù)據(jù)庫來實現(xiàn)的。但是,采用數(shù)據(jù)庫顯然會使每一事務(wù)處理的成本大于簡單的解決方案,如非持久性的分布式對象緩存。
如果你不需要持久性,就可以從眾多的對象緩存中選擇一種。關(guān)于對象緩存及其用法的討論。在有些情況下,你可能兩者都會選擇,即數(shù)據(jù)庫的持久性和數(shù)據(jù)庫前端的緩存的低成本性。這樣的實現(xiàn),既具有數(shù)據(jù)庫的持久性,也可以通過數(shù)據(jù)庫前端的緩存實現(xiàn)高成本效益的事務(wù)處理擴展。
關(guān)于分布式會話狀態(tài)緩存的考慮因素
下面是三種常見的分布式緩存的實現(xiàn)方法及其優(yōu)缺點。
只用數(shù)據(jù)庫來實現(xiàn)成本最高,但所有數(shù)據(jù)都是持久性的,在分布式環(huán)境中可以將更新和讀操作之間的沖突處理得非常好。
非持久性的分布式對象緩存比較快,成本相對較低,但出出故障后,不能恢復(fù)數(shù)據(jù),對于用戶訪問間隔時間較長的情況不適用。
有的為網(wǎng)站建設(shè),由數(shù)掂庫提供持久性,由緩存提供高性價比的擴展性,很適合需要持久性又想成本低的情況。
本文地址:http://m.hbbqcd.cn//article/3517.html