摘要:在開發可擴展的應用程序時,在SQL數據庫和NoSQL數據庫之間進行選擇通常很繁瑣。另一方面,當將狀態存儲在Web應用程序中是一個好主意時,可能會有一些用例。

當初創企業的Web應用程序的用戶數量成倍增長時,他們將面臨極大的不確定性和挑戰。他們需要靈活選擇,例如除了建立合適的團隊之外,還選擇合適的框架,數據庫和體系結構。而且,與企業不同,初創企業只有有限的時間進行擴展。更糟糕的是,如果他們足夠幸運,則可能需要在幾個月內將容量擴展十倍。

爲了瞭解Web可伸縮性的細節,我們與一些專家進行了交談,並詢問了他們改善Web可伸縮性的技巧。

Web可擴展性的基本要素

從一開始就選擇正確的工具

選擇具有可伸縮性的Web框架應該是確保可伸縮性的第一步。如果網站從一開始就建立了強大的框架,則它在業務的其他方面(例如財務,營銷,管理,人力資源等)的表現都可以很好。

可以這樣考慮:如果您從一開始就爲房屋(網站)打下堅實的基礎,則可以期望將來將房屋建造得更多,更堅固,更大。

但是,不要屈服於堅持相同框架的想法。將基於PHP的網站擴展到數十億用戶是不可能的。話雖這麼說,但如果情況出現了,您可能會在桌子上轉過身而落下一個特定的技術棧–毫不猶豫地做。

用Aditya Agarwal(DropBox的工程副總裁)的話來說,“選擇該選項時,通常會在部署,監視,操作等方面產生開銷。如果選擇使用服務體系結構,則必須自己構建大多數後端,這通常會花費很多時間。使用LAMP堆棧,您可以免費獲得很多。一旦您離開了LAMP堆棧,服務配置和監視之類的事情將由您決定。當您深入研究服務方法時,您必須重新發明輪子。”

實施多級緩存以減少緩存未命中的機會

您是否曾經注意到,當您第一次加載網頁時,所花的時間要比您訪問該網頁所需的第二,第三等時間長一點?這是一種智能邏輯,它在Web瀏覽器的後臺進行了緩存。

緩存使應用程序更容易執行,因爲它避免或延遲了每次必須加載頁面時對服務器的請求。但是,在複雜應用程序的情況下進行緩存非常棘手。這就是爲什麼建議在應用程序中實現多級緩存以使其可擴展的原因。

根據Jared Rerie 的說法,“關於服務器正在緩存的爭論,那麼爲什麼要客戶機呢?” 以我的經驗很常見。也許是因爲我們被教導要避免重複(不要重複自己)。有人可能會說,實施緩存的幾個團隊是一種浪費性的重複工作。雖然多層緩存會給系統帶來複雜性,但它並不是浪費,甚至不是真正的重複,因爲客戶端和服務器端的緩存可能有很大的不同。

使用多個數據庫維護複雜系統中的數據完整性

在開發可擴展的應用程序時,在SQL數據庫和NoSQL數據庫之間進行選擇通常很繁瑣。更糟糕的是,兩種數據庫的營銷熱潮使這一決定變得更加困難。

用Ysance的架構師Frederic Faure的話來說,“我發現SQL和NoSQL(不僅是SQL)的定位是相反的,這實在令人遺憾:NoSQL的營銷浪潮確實促使了已經存在的系統的重新推廣。在相當長的一段時間內,但是在大多數情況下很少考慮到這一點,因爲畢竟,所有內容都可以放入“良好的舊SQL模型”中。希望使所有內容都適合NoSQL模型的相反趨勢也不是非常有利可圖。”

實際上,scalegrid.io進行的一項調查表明,44.3%的企業合併了兩個或三個數據庫以擴展其應用程序。而且,SQL和NoSQL是超過75.6%的用戶使用的最受歡迎的多數據庫組合。

這就是使用多個數據庫對改善網站可伸縮性產生重大影響的原因。

除非有充分的理由,否則不要存儲狀態

有狀態與無狀態是整個網絡上的普遍爭論,開發人員在兩者的利益上存在分歧。

所有這些爭論的共同點對於可伸縮性都幾乎沒有意義。無狀態(與在Web應用程序中不存儲任何狀態有關)使您可以簡化應用程序的客戶端/服務器通信模型。這樣做的主要好處是,客戶端可以在不存儲服務器狀態的情況下向服務器請求任何內容。此外,由於無需更改整個Web服務器上的會話池,因此您的應用程序可以輕鬆擴展。

另一方面,當將狀態存儲在Web應用程序中是一個好主意時,可能會有一些用例。Lightbend的開發者倡導者Hughe Mckee在他的博客“ 如何構建成功的雲原生解決方案 ”中解釋了在購物車應用程序中保存狀態的好處。本文通過一個購物車示例說明了有狀態應用程序的擴展功能。

Per Hughe說:“談到雲原生軟件系統時,確定最佳方法取決於具體情況。在考慮無狀態系統與有狀態系統時,這當然適用。在許多情況下,無狀態方法是可以接受的解決方案。但是,越來越多的場景使用有狀態方法將是更好的選擇。對於高性能近實時和基於流的系統的需求不斷增長,這無疑是正確的。“

異步

毋庸置疑,“異步編程是提高Web可伸縮性的行之有效的方法。”

但是這個說法有多正確呢?烏迪·達漢(Udi Dahan)可能有答案。

用烏迪·達罕(Udi Dahan)的話說:“通常,在我從事諮詢工作時,我遇到了一些人,即使在他們同意異步通信模式帶來的固有可伸縮性之後,'有些事情也無法做到異步'。一個經常被引用的例子是用戶身份驗證-採取用戶名和密碼組合並針對某些後端存儲對它進行身份驗證。”

使用異步IO時,您正在同時處理數千個請求,而不會阻塞其中的任何一個。一些單線程框架(例如Node.js)可以高效地執行此操作。

避免任何單點故障

失敗是不可避免的。Web應用程序必須不受任何單點故障的影響。無論是服務器,數據庫,消息隊列,磁盤驅動器,都必須隔離並且獨立發揮功能,以確保當它們失敗時,整個系統都不會崩潰。

但是,在決定隔離任何故障或根除任何SPOF之前,請問自己一個問題:如果您編寫的代碼根本不起作用怎麼辦?如果最終編寫的舊的舊代碼在某個時候難以維護和擴展怎麼辦?

Orbit的聯合創始人肖恩·赫爾(Sean Hull)建議您在準備系統進行擴展之前消除任何單點故障。

用Sean的話來說,“ 如果您的數據位於單個主數據庫中,那將是單點故障。如果您的服務器位於單個磁盤上,那就是單點故障。這只是跟腱的技術白話。必須不惜一切代價根除這些單點故障。”

相關文章