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