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

更新於 發佈於 閱讀時間約 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
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
隨著電子商務的迅速崛起,倉儲設備成為各行業企業提高運營效率的重要組成部分。現代倉儲設備不僅僅是簡單的存放空間,而是整個供應鏈管理中的關鍵環節。如何選擇和運用合適的倉儲設備,不僅直接影響到企業的運營效率,更是企業在市場競爭中脫穎而出的重要策略。
Thumbnail
本文介紹了在網站開發中如何運用狀態機的原則和設計方法。通過具體案例分析,以及狀態和數據的區分,詳細介紹了狀態機的設計原則和應用。讀者可以通過本文瞭解如何將狀態機應用於實際的網站開發中。
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
資訊架構就像是網站的地圖,讓用戶快速找到所需的資訊。好的資訊架構可提升使用者滿意度、強化 SEO、增進擴充性、達成商業目標。資訊架構可透過使用者訪談、卡片分析、競品分析、使用者測試等方法設計。在設計資訊架構時,需考量用戶的認知方式、目標客群、資訊分類等因素。定期檢驗資訊架構,才能確保用戶體驗。
圖片大小 漂亮的圖片讓人賞心悅目,對網站美化也是一大加分項,但若是為了呈現自家商品或吸引人的圖片搭配文字,而塞進過量的圖片,導致網站本身太重跑得太慢,容易使客人失去耐性。|SEO工具 隨著時代的進步網路速度也與時俱進,但若網站本身太重,就算網路狀況再良好也無法馬上將網站載好,根據統計,大多數人的
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
相信身為一個SEOer,最常聽到客戶掛在嘴邊說的,就是網站流量為什麼掉下來了?為什麼排名不見了?這些都是在做SEO時,經常耳熟能詳的問題之一,如果你還不瞭解網站出現的問題,那我推薦你可以看看這一篇文章了!
Thumbnail
這是一篇分析了一家店舖流量與營業額之間關係的案例研究。通過比較6月和7月的數據,以及預測8月的情況,文章探討了流量增長對於營業額的影響。作者提出了一些疑問,並對於訪客增加的比例和營業額的變化進行了分析。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
隨著電子商務的迅速崛起,倉儲設備成為各行業企業提高運營效率的重要組成部分。現代倉儲設備不僅僅是簡單的存放空間,而是整個供應鏈管理中的關鍵環節。如何選擇和運用合適的倉儲設備,不僅直接影響到企業的運營效率,更是企業在市場競爭中脫穎而出的重要策略。
Thumbnail
本文介紹了在網站開發中如何運用狀態機的原則和設計方法。通過具體案例分析,以及狀態和數據的區分,詳細介紹了狀態機的設計原則和應用。讀者可以通過本文瞭解如何將狀態機應用於實際的網站開發中。
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
資訊架構就像是網站的地圖,讓用戶快速找到所需的資訊。好的資訊架構可提升使用者滿意度、強化 SEO、增進擴充性、達成商業目標。資訊架構可透過使用者訪談、卡片分析、競品分析、使用者測試等方法設計。在設計資訊架構時,需考量用戶的認知方式、目標客群、資訊分類等因素。定期檢驗資訊架構,才能確保用戶體驗。
圖片大小 漂亮的圖片讓人賞心悅目,對網站美化也是一大加分項,但若是為了呈現自家商品或吸引人的圖片搭配文字,而塞進過量的圖片,導致網站本身太重跑得太慢,容易使客人失去耐性。|SEO工具 隨著時代的進步網路速度也與時俱進,但若網站本身太重,就算網路狀況再良好也無法馬上將網站載好,根據統計,大多數人的
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
相信身為一個SEOer,最常聽到客戶掛在嘴邊說的,就是網站流量為什麼掉下來了?為什麼排名不見了?這些都是在做SEO時,經常耳熟能詳的問題之一,如果你還不瞭解網站出現的問題,那我推薦你可以看看這一篇文章了!
Thumbnail
這是一篇分析了一家店舖流量與營業額之間關係的案例研究。通過比較6月和7月的數據,以及預測8月的情況,文章探討了流量增長對於營業額的影響。作者提出了一些疑問,並對於訪客增加的比例和營業額的變化進行了分析。