如何設計高流量的系統設計架構

更新於 2024/04/07閱讀時間約 7 分鐘

討論這個議題似乎有些抽象,當我們的系統初次上線時,實際上有高達 80% 的時間處於低流量狀態。我們就舉例像是:購物網、社群平台這類特定類型的網站,比較有可能面臨高流量的情況。

然而,我們不能等到問題發生後才急忙改變架構,那樣的後果不堪設想。既然如此,為何不在一開始就規劃一個能夠應對未來可能出現的高流量情況的穩健架構呢?


設計一套能夠應對高流量情況的系統,需要從多個維度進行考慮與規劃。為了確保系統的穩定性與擴展性,以下是一些實用且被廣泛認可的策略和最佳做法:

  1. 水平擴展:通過在多個服務器上分散負載,水平擴展允許系統隨著需求增加而增加更多的資源。這可以通過增加更多的應用伺服器或資料庫節點來達成,從而有效應對高流量的挑戰,並保障系統在需求增加時的靈活擴展。
  2. 負載均衡:負載均衡器能夠將入站流量平均分配至多個服務器,以防止任何單一節點的過載,從而提升系統的整體可用性與穩定性。Nginx、HAProxy 以及 Amazon AWS 的 Application Load Balancer 等都是常見的選擇。
  3. 快取策略:適當地使用快取可以顯著減少對後端資料庫的直接請求,從而提高系統的響應速度和整體性能。Redis 和 Memcached 是極佳的快取解決方案。對於靜態內容,如圖片和前端資源,使用 CDN 進行快取也能有效減輕後端的壓力。
  4. 資料庫性能優化:透過合理使用索引、資料庫分區以及資料庫分片等技術,可以顯著提升資料庫的處理能力與查詢效率。此外,根據應用的具體需求選擇最合適的資料庫系統(關係型或非關係型)也至關重要。
  5. 採用微服務架構:將一個大型應用拆分成多個小的、獨立的微服務,可以使系統更易於管理與擴展。每個微服務都可以獨立部署和擴展,從而使系統能夠更靈活地應對各個服務的具體需求。
  6. 限流與熔斷:限流可以預防系統因突發的大流量而過載,熔斷則可以保護系統在某個部分出現故障時,避免故障蔓延導致整個系統的崩潰。這兩種機制對於維持系統的穩定運行至關重要。

透過這些策略的實施,不僅可以提升系統對高流量的承受能力,還能保證在面臨不同規模的用戶需求時,系統的平滑運行和高可用性。


raw-image

在實務上

當你負責的系統已經穩定運行了數月並且有了一定程度的流量,或者當你被賦予任務去設計一個能夠應對高流量的系統時,那麼「水平擴展」和「負載均衡」無疑是非常直接且有效的策略。

這兩個策略能夠透過增加『資源』來達成將流量分散的效果,而具體要如何分流,則需視系統的瓶頸所在來決定,可能的焦點包括:

  • 網站服務:若網站本身的請求處理能力不足,可以透過增加更多的網站服務器並透過負載均衡器分散請求來提升整體處理能力。
  • 資料庫系統:資料庫是常見的系統瓶頸之一,可以考慮透過資料庫集群、讀寫分離或資料庫分片等策略來增強其處理高流量的能力。
  • 網路架構:網路設備與架構也可能成為流量瓶頸,此時可以透過升級網路設備或優化網路架構來改善。


補充一下

關於為什麼「快取」可能不是所有情況下的首選解決方案:

實際上,是否採用快取要看你的系統主要服務是什麼。像是涉及到實時更新的「銷售類」網站,顯示的是商品的即時庫存,這種情況下用快取就不太合適,因為資訊需要實時反映最新狀態。

另一方面,對於以內容展示為主的網站,比如說:像是「方格子」,快取就非常有用了。畢竟,當一篇文章成為熱門內容,被大量訪問時,文章本身的內容是不會改變的,這時候使用快取能有效減輕伺服器壓力。至於文章的互動部分,如留言和點讚等,則可以採用其他方法進行動態更新,不必依賴快取。

所以,選擇是否使用快取,得根據系統的具體需求和特點來決定,並非所有場景都適用。


水平擴展 (Horizontal Scaling)

在談到水平擴展 (Horizontal Scaling)的具體做法時,確保應用的無狀態運作是關鍵。以下是針對在 Laravel 框架中實踐無狀態應用服務的一些建議,以助於應對高流量情境:

  1. 無狀態應用服務:讓你的 Laravel 應用成為無狀態的,這樣就能在多台機器間分散使用者請求。重點在於,要將 session 資訊存放在像是 Redis 或 Memcached 這樣的中央儲存系統,確保各服務間的狀態同步。
  2. Session 的集中式管理:將 session 存放在集中式的儲存系統,不論使用者接觸到哪一台伺服器,都能獲得一致的 session 資訊。Laravel 提供了容易設置的選項來實現這一點:
    // config/session.php
    'driver' => env('SESSION_DRIVER', 'redis'),

    // config/database.php
    'redis' => [
    'client' => env('REDIS_CLIENT', 'predis'),
    'default' => [
    'host' => env('REDIS_HOST', '127.0.0.1'),
    'password' => env('REDIS_PASSWORD', null),
    'port' => env('REDIS_PORT', 6379),
    'database' => env('REDIS_DB', 0),
    ],
    ],
  3. 避免使用本地存儲:對於需要被多個應用實例訪問的資料,不應該將其存儲在本地檔案系統。改用雲儲存服務如 Amazon S3 或 Google Cloud Storage,或者是使用網絡檔案系統(NFS)來實現資料的共享。
  4. 應用邏輯與狀態分離:盡量將應用邏輯與用戶狀態分離開來,將必要的狀態資訊存儲於資料庫或其他中央管理的服務。
  5. 採用無狀態認證方式:如 JWT 等無狀態認證機制可以跨服務共享使用者身份,無需在每次請求時都驗證狀態。
  6. 應用的容器化:使用 Docker 等容器技術部署應用,可以確保在不同環境中應用的一致性,並且容器的快速部署與銷毀特性非常適合動態擴展。
  7. 無狀態的 API 設計:確保 API 的每次請求都是自包含的,即包含了完成請求所需的所有資訊,這樣 API 就可以在多個伺服器上無縫運作。
  8. 利用消息隊列與後台處理:對於耗時的任務,將其放入後台隊列中處理,可以減輕前端伺服器的壓力,並且隊列服務本身也可以根據任務量進行擴展。
  9. 性能優化:使用各種中間件(middleware)、快取和數據預加載等技術,減少對狀態的依賴,從而降低單點壓力,提升整體性能。

透過上述的策略和技術,你的 Laravel 應用將更加適合於水平擴展,從而提高應對高流量情境的能力。


提到的這些建議,只是入門的一步。實際上,每個系統的情境都有其獨特性,不可能單靠套用幾個策略就能解決所有問題。要真正優化系統,除了這些大方向的架構調整外,還需要深入到程式碼層面,細心審視每一行程式的效能,以及資料存取方式的合理性。只有透過全面的檢視和不斷的調整,才能使系統更加穩健,應對各種挑戰。


註:負載均衡是另一種應用/傳輸層的結構處理,以後有機會再發篇文章說明~

這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,這裡有幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
在連假期間,我探索了「知識詛咒」這個話題,揭露了專家在分享知識時常見的盲點。提出了三大觀點來應對:情境導入,讓知識有著落;探討不同情境下可能的結果,展現靈活思考;並且至少提供兩種例證,增強說服力。這篇分享不僅是自我反思的成果,也希望能給大家在溝通和知識分享上一些新的啟示。
放鬆的週末,我與幾位同事決定提升我們的後端開發技巧,選擇了「日期範圍生成器」作為我們的小型實作。作為團隊中較有經驗的PHP工程師,我引領著團隊從基礎程式碼的撰寫開始,進而深入到物件導向的結構調整,最後提高程式可擴充性的挑戰。雖然過程中遇到不少困難,但我們通過不斷的討論和優化,最終成功克服了所有挑戰。
在程式世界裡,if 條件句是我們的好朋友,幫我們做各種決策。如果不注意可能會讓我們掉進小陷阱。文中透過幾個例子,在使用 if 時可能會遇到的一些常見問題,像是不必要的 if、過於複雜的條件、忘了用嚴格比較,還有嵌套太深的 if。透過這篇文章,你將學到如何避免這些小錯誤,寫出更乾淨、更有效率的程式碼。
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
在連假期間,我探索了「知識詛咒」這個話題,揭露了專家在分享知識時常見的盲點。提出了三大觀點來應對:情境導入,讓知識有著落;探討不同情境下可能的結果,展現靈活思考;並且至少提供兩種例證,增強說服力。這篇分享不僅是自我反思的成果,也希望能給大家在溝通和知識分享上一些新的啟示。
放鬆的週末,我與幾位同事決定提升我們的後端開發技巧,選擇了「日期範圍生成器」作為我們的小型實作。作為團隊中較有經驗的PHP工程師,我引領著團隊從基礎程式碼的撰寫開始,進而深入到物件導向的結構調整,最後提高程式可擴充性的挑戰。雖然過程中遇到不少困難,但我們通過不斷的討論和優化,最終成功克服了所有挑戰。
在程式世界裡,if 條件句是我們的好朋友,幫我們做各種決策。如果不注意可能會讓我們掉進小陷阱。文中透過幾個例子,在使用 if 時可能會遇到的一些常見問題,像是不必要的 if、過於複雜的條件、忘了用嚴格比較,還有嵌套太深的 if。透過這篇文章,你將學到如何避免這些小錯誤,寫出更乾淨、更有效率的程式碼。
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
【高雄】軟裝設計推薦-如何挑選窗簾?4個技巧增添居家巧思! 在居家空間中,窗簾是不可或缺的元素之一。它不僅能夠調節室內光線,更是打造居家風格的亮點。那麼,在眾多的窗簾款式中,你知道該如何挑選適合自己家居的窗簾嗎? 以下 𝐂𝐡𝐚𝐧𝐧𝐞𝐥 分享4個挑選窗簾的技巧,幫助你在窗
Thumbnail
除了牆面、地板,窗簾也是一個空間佔大面積的元素,更是影響風格的其中一大要素,窗簾的種類百百種,不同類型或風格的空間,該如何選擇合適的窗簾?不僅要考量到採光、通風或東西曬的問題,常見的窗簾種類,依照樣式與材質的不同分成以下幾種,讓 𝐂𝐡𝐚𝐧𝐧𝐞𝐥 𝐃𝐞𝐜𝐨 伽宜諾 手把手帶你
Thumbnail
為了深入探討新風機與全熱交換器之間的技術差異,本文特地搜尋了台灣學界針對這兩種機械的學術論文。然而,由於新風機為近期新興的機械設備,相關的研究數據相對缺乏,相對地,全熱交換器的研究資料較為充足。 基於上述原因,本文將主要著重於全熱交換器的特點分享,並對新風機進行輔助性的探討。
Thumbnail
是那麼一點平易近人的輕奢風格,再加上百搭不膩的美乃滋宅風格,你的空間設計,住起來是不是也該這麼可口? 收入高雄都會公園的綠意,整排落地窗看得見樹葉被風輕撫後的搖曳生姿,樹葉間彼此拍起的聲響,是大自然中最好聽也最無造作的風鈴聲。森林之星,在外,有著無法複製的自然綠景,在內,41 坪的空間以現代輕奢、
Thumbnail
造時尚的現代簡約風格客廳的五大基本要素 最後我們要著手打造一間充滿現代簡約氣息的客廳。 現代人越來越注重生活品質,家居裝修風格也成為了一個熱門話題。簡約風格因其簡潔、舒適、自然的風格,受到了很多年輕人的喜愛。那麼,如何打造一個時尚的現代簡約風格客廳呢?跟著我們的介紹前進,逐步讓你的客廳變得更加舒適、
Thumbnail
由⽞關、客廳設計以及餐廳等組成的「公領域聯盟」,是⼀家的⾨⾯也是彰顯主⼈品味的待客之道。在這公開的空間中,如何做⾜「⾼顏值收納」?選對系統櫃,就是⾸要任務。 為什麼選擇對的系統櫃很重要?除了讓空間擁有強⼤的收納外,若能把配⾊、不同型態的櫃體交錯運⽤,展現系統櫃的多樣⾯貌,就可讓空間更活潑。想在公領域
Thumbnail
放鬆、不壓迫的療癒小宅,美廳苑,為空間抹上淡妝。設計師打破小宅不敢多做造型,擔心壓迫的印象,從中加入圓弧元素,彷若神奇的煉金術,「圓」,成為了這個家最治癒的語彙。 「從玄關到客廳的主要動線,會經過餐廳,如何讓動線輕盈,釋放放鬆感是我們首要解決的。」因此設計師以飯糰造型餐桌,取代常見矩形。在移動的過程
Thumbnail
摘要 本文將介紹我們如何將定潮屋主的需求轉化為實際設計。在定潮 6F 的設計中,大量使用了木質和圓弧元素,營造出自然、柔和的氛圍。此外,根據定潮 L 宅屋主的需求,我們也設計了一個大面積的書房,讓屋主能夠在舒適的環境下工作和閱讀。 而在定潮 20F 的設計中,我們注重細節和質感,並運用了多種材料和元
Thumbnail
騎著摩托車,在濕濕冷冷的台北穿梭在大街小巷的人們,對工作的期待,是不是也跟著進入寒冷的時節了呢? 總有一些時候,我們在拜訪客戶之間思考著自己為何而戰,在整理工作匯報的時候,懷疑著自己是否真的在成長,會議上提出費盡心血的企劃時,總擔心著自己的努力會輕易的被否定。 我始終認為,有在思考總是一件好事⋯⋯
Thumbnail
近年來,小坪數裝潢的需求量,較過去有越來越多的趨勢,說明著未來在室內裝修的需求上,小家庭、單身族的比例也會逐漸拉高。 例如像甫完工的城揚建設新案“J.ART”、“JMODERN”就是屬於小坪數高質感的精品式住宅。 城揚建設一直以來10幾年在室內裝潢設計上都與藝瓦高雄室內設計,有著長期且密切的合作,十
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
【高雄】軟裝設計推薦-如何挑選窗簾?4個技巧增添居家巧思! 在居家空間中,窗簾是不可或缺的元素之一。它不僅能夠調節室內光線,更是打造居家風格的亮點。那麼,在眾多的窗簾款式中,你知道該如何挑選適合自己家居的窗簾嗎? 以下 𝐂𝐡𝐚𝐧𝐧𝐞𝐥 分享4個挑選窗簾的技巧,幫助你在窗
Thumbnail
除了牆面、地板,窗簾也是一個空間佔大面積的元素,更是影響風格的其中一大要素,窗簾的種類百百種,不同類型或風格的空間,該如何選擇合適的窗簾?不僅要考量到採光、通風或東西曬的問題,常見的窗簾種類,依照樣式與材質的不同分成以下幾種,讓 𝐂𝐡𝐚𝐧𝐧𝐞𝐥 𝐃𝐞𝐜𝐨 伽宜諾 手把手帶你
Thumbnail
為了深入探討新風機與全熱交換器之間的技術差異,本文特地搜尋了台灣學界針對這兩種機械的學術論文。然而,由於新風機為近期新興的機械設備,相關的研究數據相對缺乏,相對地,全熱交換器的研究資料較為充足。 基於上述原因,本文將主要著重於全熱交換器的特點分享,並對新風機進行輔助性的探討。
Thumbnail
是那麼一點平易近人的輕奢風格,再加上百搭不膩的美乃滋宅風格,你的空間設計,住起來是不是也該這麼可口? 收入高雄都會公園的綠意,整排落地窗看得見樹葉被風輕撫後的搖曳生姿,樹葉間彼此拍起的聲響,是大自然中最好聽也最無造作的風鈴聲。森林之星,在外,有著無法複製的自然綠景,在內,41 坪的空間以現代輕奢、
Thumbnail
造時尚的現代簡約風格客廳的五大基本要素 最後我們要著手打造一間充滿現代簡約氣息的客廳。 現代人越來越注重生活品質,家居裝修風格也成為了一個熱門話題。簡約風格因其簡潔、舒適、自然的風格,受到了很多年輕人的喜愛。那麼,如何打造一個時尚的現代簡約風格客廳呢?跟著我們的介紹前進,逐步讓你的客廳變得更加舒適、
Thumbnail
由⽞關、客廳設計以及餐廳等組成的「公領域聯盟」,是⼀家的⾨⾯也是彰顯主⼈品味的待客之道。在這公開的空間中,如何做⾜「⾼顏值收納」?選對系統櫃,就是⾸要任務。 為什麼選擇對的系統櫃很重要?除了讓空間擁有強⼤的收納外,若能把配⾊、不同型態的櫃體交錯運⽤,展現系統櫃的多樣⾯貌,就可讓空間更活潑。想在公領域
Thumbnail
放鬆、不壓迫的療癒小宅,美廳苑,為空間抹上淡妝。設計師打破小宅不敢多做造型,擔心壓迫的印象,從中加入圓弧元素,彷若神奇的煉金術,「圓」,成為了這個家最治癒的語彙。 「從玄關到客廳的主要動線,會經過餐廳,如何讓動線輕盈,釋放放鬆感是我們首要解決的。」因此設計師以飯糰造型餐桌,取代常見矩形。在移動的過程
Thumbnail
摘要 本文將介紹我們如何將定潮屋主的需求轉化為實際設計。在定潮 6F 的設計中,大量使用了木質和圓弧元素,營造出自然、柔和的氛圍。此外,根據定潮 L 宅屋主的需求,我們也設計了一個大面積的書房,讓屋主能夠在舒適的環境下工作和閱讀。 而在定潮 20F 的設計中,我們注重細節和質感,並運用了多種材料和元
Thumbnail
騎著摩托車,在濕濕冷冷的台北穿梭在大街小巷的人們,對工作的期待,是不是也跟著進入寒冷的時節了呢? 總有一些時候,我們在拜訪客戶之間思考著自己為何而戰,在整理工作匯報的時候,懷疑著自己是否真的在成長,會議上提出費盡心血的企劃時,總擔心著自己的努力會輕易的被否定。 我始終認為,有在思考總是一件好事⋯⋯
Thumbnail
近年來,小坪數裝潢的需求量,較過去有越來越多的趨勢,說明著未來在室內裝修的需求上,小家庭、單身族的比例也會逐漸拉高。 例如像甫完工的城揚建設新案“J.ART”、“JMODERN”就是屬於小坪數高質感的精品式住宅。 城揚建設一直以來10幾年在室內裝潢設計上都與藝瓦高雄室內設計,有著長期且密切的合作,十