無法完全無狀態的大型網站如何在Web層實現極高的可伸縮性?爲了防止負載平衡器瓶頸,分層(原文如此!)Web層?
有像eBay和亞馬遜這樣的網站,不能完全無國籍,因爲他們有一個購物車或類似的東西。將購物車中的每件商品都編碼到URL中是不可行的,也不可能將每件商品都編碼到cookie中並在每個連接處發送它。因此,亞馬遜只是將session-id存儲到正在發送的cookie中。所以我明白,eBay和亞馬遜的網絡層的可擴展性應該比谷歌搜索引擎的可擴展性要難得多,在谷歌搜索引擎中,所有東西都可以編碼到URL中。
另一方面,eBay和亞馬遜都絕對大規模擴展。有傳言說eBay上有15000個J2EE應用服務器。
這些網站如何處理這兩個問題:極高的可伸縮性和狀態性?由於該網站是有狀態的,因此執行簡單的DNS平衡並不可行。所以人們會認爲這些公司有一個基於硬件的負載均衡器,比如BigIP,Netscaler或類似的東西,這是該站點單一IP地址背後的唯一設備。此負載均衡器將解密SSL(如果編碼),檢查該cookie並根據該cookie的會話ID來決定哪個應用程序服務器持有該客戶的會話。
但是,這不可能正常工作,因爲沒有單個負載平衡器可能處理數千個應用程序服務器的負載?我會想象,即使這些硬件負載平衡器也不會擴展到這樣的水平。
另外,負載平衡是爲用戶透明地完成的,即用戶不會被轉發到不同的地址,但仍然全部集體地一直停留在www.amazon.com上。
所以我的問題是:是否有一些特殊的技巧,可以實現像Web層的透明分片(而不是數據庫層)?只要未檢查cookie,就無法知道哪個應用程序服務器正在進行此會話。
編輯:我意識到只需要透明度,如果有需要蜘蛛和書籤的網站。例如。如果該網站僅僅是一個網絡應用程序,例如飛機票或火車票預定系統,那麼只需將用戶重定向到位於不同URL之後的特定網站服務器羣即可,例如, a17.ticketreservation.com。在這種特定情況下,僅使用多個應用程序服務器集羣是可行的,每個應用程序服務器集羣都在自己的負載平衡器後面。有趣的是,我沒有找到使用這種概念的網站。 編輯:我發現這個概念discussed在highscalability.com,這裏的討論是指雷珠的一篇文章命名爲"Client Side Load Balancing for Web 2.0 Applications"。雷珠用透明腳本來透明地做這個客戶端負載平衡。
即使存在缺陷,如書籤,xss等,我認爲這對於某些特殊情況聽起來像是一個非常好的主意,即幾乎無需內容的web應用程序,這些應用程序不需要被蜘蛛或書籤(例如票務預訂系統或類似的東西)。那麼就不需要透明地進行負載平衡。
可能存在從主站點到服務器的簡單重定向,例如,從www.ticketreservation.com重定向到a17.ticketreservation.com。從那裏用戶停留在服務器a17。 a17不是服務器,而是集羣本身,可以實現冗餘。
初始重定向服務器本身可能是負載均衡器後面的集羣。這樣,可以實現非常高的可擴展性,因爲www後面的主要負載均衡器在每個會話開始時只被擊中一次。
當然,重定向到不同的URL看起來非常討厭,但對於單純的Web應用程序(無論如何不需要被蜘蛛,深層鏈接或深藏書籤),這應該只是用戶的光學問題?
重定向集羣可以輪詢應用集羣的負載並相應地調整重定向,從而實現平衡而不僅僅是負載分佈。
無狀態Web服務器如何找到正確的應用程序服務器? 每個Web服務器都必須知道任何應用程序服務器持有的每個會話嗎?會不會是這種可怕的通信開銷? – SAL9000 2008-10-19 18:07:54