從頭開始建立可擴展的後端可能非常困難。
透過正確的方法,您可以建立一些可以像您的應用程式一樣成長的東西。
今天,我們將介紹幫助您擴展後端的七個實用步驟,以及 Encore(作為後端框架)如何在其中一些方面提供協助。
讓我們跳進去吧。
在我們開始討論重點之前,了解整體概念很重要。
為了確保您的應用程式在流量、用戶或資料成長時表現良好,必須擴展後端。例如,考慮一個每天處理數百萬張照片上傳的社交媒體應用程式或一個每秒管理數千個訂單的銷售的電子商務網站(例如亞馬遜)。
有兩種主要方法:
✅ 垂直擴充(新增更多資源至單一伺服器)
✅ 水平擴展(在多個伺服器之間分配負載)。
如果您想了解水平縮放和垂直縮放之間的區別,可以觀看此影片。
https://www.youtube.com/watch?v=dvRFHG2-uYs
我的建議?如果你剛開始,不要想太多。
我相信,當您確定需要更好的基礎設施時,就需要擔心這一點。在那之前,您可以依賴通常的東西,許多應用程式甚至不需要像這樣的過度設計。
也就是說,讓我們了解更多。
將您的後端想像成建築物的藍圖。當你增加更多的權重(或使用者)時,不好的基礎會導致問題。讓我們看看您可以使用的主要兩種類型的架構。
整體架構意味著一切都建構成一個大型應用程式。一開始比較容易,但隨著你的成長可能會變得混亂。應用程式的所有部分都相互依賴,因此如果其中一個部分損壞,整個應用程式可能會受到影響。
許多流行的程式碼庫都是以此開始的,例如 Instagram 的早期版本。這種架構適用於較小的應用程式,但隨著規模的擴大,它們可能會變得混亂。
說實話,還是可以用模組化的方式來設計,這樣大部分的缺點就可以解決。
微服務架構將應用程式分解為更小的、獨立的服務,透過 API 進行通訊。這種方法更具可擴展性和靈活性,因為您可以獨立更新或擴展每個服務,而不會影響整個系統。
Netflix、亞馬遜和無數其他公司都使用這種方式,其中應用程式的不同部分(如用戶身份驗證、支付、推薦)由單獨的服務處理。
這可能會變得乏味且複雜,因此僅建議大公司這樣做。
您還應該閱讀5 個常見的微服務痛點以及如何處理它們。
如果您對比較指南感興趣,請查看 Atlassian 的微服務與 Monolith 的部落格。
Encore是一個開源後端框架,支援微服務架構。它旨在從第一天起為團隊提供建立微服務所需的工具。
它還提供了一個稱為Flow
的視覺化工具,可以讓您始終了解整個系統的最新視圖,幫助您推理微服務架構並確定哪些服務相互依賴以及它們如何協同工作。
✅ 在瓶頸發展成大問題之前對其進行追蹤。
✅ 立即揭示其依賴關係的性質和規模。
✅ 在您更改程式碼時即時自動更新以反映您的架構。
無狀態意味著每個伺服器不需要記住使用者會話。這就像不依賴一位收銀員來完成您的購物一樣,任何收銀員都可以幫助您。
這種方法可以更輕鬆地加入或刪除伺服器,而無需中斷現有應用程式,並且它們的執行不依賴彼此。
它對於預計流量高峰的應用程式更有用,例如音樂首映期間的 Spotify 或銷售活動期間的電子商務網站(例如亞馬遜)。
為了實現這一點,必須卸載會話管理。您可以使用:
JWT (JSON Web Tokens)
:在請求之間傳遞使用者資料而不將其儲存在伺服器上的簡單方法。
Redis
:用於會話管理,例如將臨時會話資料儲存在記憶體中,以及快取經常存取的資料,以最大限度地減少資料庫呼叫,從而提高效能。您也可以使用Memcached代替 Redis。
例如, Netflix
在用戶會話中廣泛使用無狀態設計,這使得無論伺服器負載如何,都可以實現流暢的串流傳輸。
此外, REST APIs
通常在設計上是無狀態的,這就是它們非常適合擴充的原因。
ByteByteGo 的無狀態備忘單圖
在本節中,我們將討論負載平衡的主題。這是將傳入請求均勻分配到多個伺服器的過程,以確保沒有任何伺服器被淹沒,否則可能會導致速度減慢或崩潰。
它提高了可用性、容錯能力以及包括可擴展性在內的許多功能。
有不同的演算法,每種演算法都針對獨特的流量模式:
⚡ Round Robin
:將請求依序分配給迴圈中的每個伺服器。它很簡單,但可能會遇到不均勻的負載。
⚡ Least connections
:將流量定向到活動連接最少的伺服器。
⚡ Weighted Round Robin
:根據容量為每個伺服器分配權重,允許權重較高的伺服器處理更多流量
⚡ IP Hash
:IP哈希負載平衡演算法可讓您使用客戶端IP位址的雜湊值來決定哪台伺服器滿足請求。
Equinix 有一篇有趣的文章,詳細介紹了負載平衡演算法如何與視覺化圖表搭配使用。
以下是一些最廣泛使用的工具來實現這一點:
NGINX
:開源Web伺服器和反向代理,在處理負載平衡和快取方面非常靈活。
AWS ELB
:雲端管理的負載平衡器,可根據需求自動跨執行個體分配傳入流量並進行擴充。
HAProxy
:輕量級且高度可靠的開源負載平衡器,能夠以最小的延遲處理大量流量。
您可以在線上部落格上找到更多工具(除這些)。
提示:您可以將負載平衡器與 Cloudflare 等內容交付網路 (CDN) 結合起來,以減少伺服器上的負載。
隨著應用程式的成長,您的資料庫可能會成為一個主要問題(因為它通常從未優化過)。緩慢的查詢和延遲會讓用戶感到沮喪並拖垮一切。
您可以使用一些明智的策略來正確處理負載。
⚡ Indexing
:對經常查詢的欄位使用索引以加快查找速度。例如,電子商務應用程式可以對產品 ID 建立索引,以便更快地獲得搜尋結果。
⚡ Caching
:將經常存取的資料儲存在記憶體中,減少對資料庫的直接命中次數。 Redis 或 Memcached 在這裡很有用。
⚡ Database sharding
:對於大型應用程式,您可以將資料庫分片,就像將其分成更小、更易於管理的部分。每個部分(稱為分片)可以分佈在多個伺服器上。
⚡ Database Partitioning
:您可以將資料庫拆分為更小的、可管理的部分(例如按區域劃分客戶)以分配負載。
⚡ Connection pooling
:使用池庫有效地管理資料庫連接,而不會使資料庫不堪負荷。
還有更多概念,例如查詢優化和非規範化,但我不會在這裡涵蓋所有內容(否則這會很長)。
如果您的應用程式變得很大,建議使用 MongoDB、Amazon Aurora 或 CockroachDB 等分散式資料庫,它們可以更好地處理更大的資料集和流量。
如果您想了解更多訊息,我建議您查看:
freeCodeCamp 提供的了解資料庫擴充模式的指南
MongoDB 的資料庫擴展
ByteByteGo 的資料庫擴充備忘單
隨著應用程式的擴展,智慧監控和日誌記錄可以幫助您掌握後端的健康狀況並在問題失控之前發現問題。
想像一下,您的應用程式一夜之間火爆,流量激增,一開始一切似乎都很好。然後,用戶開始報告錯誤。如果沒有適當的監控和日誌,您將被蒙在鼓裡,無法找出到底出了什麼問題。
獲得即時洞察和詳細記錄,以便您可以更快地辨識瓶頸並進行除錯,這將使您的工作變得更加輕鬆,尤其是在意外流量期間。
監控工具即時追蹤您的應用程式的效能。它們為您提供伺服器負載(資源使用)、回應時間和錯誤率等指標,以便您可以發現趨勢。您可以使用以下工具:
Datadog
:提供整個堆疊的可見性。它提供日誌管理、應用程式效能監控(APM)甚至即時儀表板。
Prometheus
:開源監控工具,以指定的時間間隔從配置的目標收集指標。此外,它還與 Grafana 很好地整合以可視化資料。
New Relic
:另一個監控工具,提供與交易時間、錯誤率和資料庫查詢效能相關的見解。
您甚至可以設定警報,以便在出現問題時通知您的團隊。
日誌記錄後端中的每個重要事件,例如請求、錯誤或警告。它就像您的應用程式的日記,可以幫助您在出現問題時進行除錯。
使用ELK Stack或AWS CloudWatch等工具進行集中日誌記錄可以輕鬆搜尋和分析所有服務的日誌。
結構化日誌記錄(JSON 格式)使日誌易於機器讀取,從而使除錯過程稍微容易一些。
追蹤有助於追蹤多個服務中的單一請求,找出緩慢或失敗的部分。 Jaeger或OpenTelemetry等工具非常適合此目的。
為了獲得最大輸出,您可以結合監視、日誌和追蹤。您可以使用 encore 來實現所有這些。
✅ Encore 提供分散式追蹤來追蹤應用程式和基礎架構中的請求。
與使用追蹤通常需要進行的密集檢測相反, Encore 自動擷取所有環境中整個應用程式的追蹤。獨特的是,這意味著您甚至可以在本地開發中使用追蹤來幫助除錯和加速迭代。
您可以存取大量訊息,例如堆疊追蹤、結構化日誌記錄、HTTP 請求、網路連接資訊、API 呼叫、資料庫查詢等。
✅ 在 Encore 雲端中,您還可以獲得追蹤關鍵指標的內建支援。為您的應用程式定義自訂指標也很容易。
✅ Encore 提供日誌記錄的內建支持,它將自由格式的日誌訊息與結構化且類型安全的鍵值對相結合。它使計算機更容易解析、分析和索引。
您只需將其新增至模組: import log from "encore.dev/log";
。
然後,您可以呼叫任何日誌記錄函數(例如error
、 warn
、 info
、 debug
或trace
來發出日誌訊息。
const logger = log.with({is_subscriber: true})
logger.info("user logged in", {login_method: "oauth"}) // includes is_subscriber=true
您也可以透過執行以下命令將日誌直接直播到終端: encore logs --env=prod
。閱讀有關文件的更多資訊。
簡而言之,Encore 提供了很多東西,包括一種視覺化雲端微服務架構並自動取得具有完整 API 文件的服務目錄的方法。
如果您有興趣了解更多訊息,可觀察性原則指南:重要性、實際實現和最佳實踐是一個不錯的起點。
隨著應用程式的擴展,手動設定伺服器、配置環境或部署程式碼有時會減慢您的速度。自動化消除了大部分重複性任務並提高了一致性(即使是一點點)。
🎯 什麼是基礎設施自動化?
基礎設施自動化就像使用工具自動管理和配置伺服器、網路和資料庫,無需手動幹預。
Terraform或AWS CloudFormation等工具可讓您將基礎架構定義為程式碼 (IaC)。
借助 IaC,您只需一個命令即可啟動相同的開發、測試和生產環境。
Pulumi就是這樣一種現代 IaC 工具,它使用您已知的程式語言,例如 JavaScript 或 Python。
DevOps 自動化改善了 CI/CD 管道、部署流程和監控任務。
Jenkins 、 GitHub Actions或GitLab CI等工具有助於更快、無錯誤的程式碼部署。
捲動更新或藍綠部署可以輕鬆進行,無需停機。
例如,Kubernetes 透過自行管理應用程式的擴充和負載平衡來自動化容器編排。
讓我們看看 Encore 如何在這方面提供幫助。
Encore 可讓您將基礎架構定義為應用程式中類型安全的物件,從而將基礎架構與應用程式程式碼統一起來。然後,Encore 可以透過解析應用程式程式碼來自動化基礎架構配置和 DevOps。
Encore Cloud 在所有環境和所有主要雲端供應商之間自動配置所有必要的基礎設施,無需更改應用程式程式碼。
使用 Encore,您無需在應用程式程式碼中定義任何雲端服務細節。這表示部署後,您可以安全地使用雲端提供者的控制台修改已設定的資源或使用 Encore Cloud 儀表板中的內建設定 UI。 Encore Cloud 負責在兩個方向上自動同步變更。
還有很多其他事情可以變得更容易Encore Cloud 可以完全自動化 AWS 和 GCP 上的 DevOps 和基礎設施,將 DevOps 工作減少近 90% 。
如果您有興趣了解更多訊息,請查看:
Encore 文件用於研究基礎架構配置自動化。
什麼是 DevOps 自動化:如何開始使用 LambdaTest
快取可能是後端可擴展性中最重要的部分,經常被忽視,但能夠大大減少回應時間和伺服器負載。
秘訣在於為應用程式中最需要快取的部分巧妙地使用快取。
快取用於臨時儲存經常存取的資料,以便可以更快地滿足將來的請求,而無需重複查詢資料庫或重新處理資訊。
例如,考慮一下像亞馬遜這樣的電子商務應用程式在黑色星期五銷售期間的情況。數以百萬計的用戶搜尋熱門優惠和暢銷書。
該應用程式可以將最受歡迎的產品及其詳細資訊快取幾分鐘,而不是每次搜尋都查詢資料庫。這不僅可以縮短使用者的回應時間,還可以減少高峰流量期間的資料庫壓力。
⚡ Application-Level Caching
:Django 或 Express.js 等框架支援特定業務邏輯的記憶體中快取。
⚡ In-Memory Caching
:非常適合會話資料、使用者設定檔或任何需要低延遲的頻繁存取的資料。 Redis 或 Memcached 非常適合此目的。
⚡ Content Delivery Networks
:Cloudflare 或 Akamai 等服務將靜態檔案(例如映像、CSS、JavaScript)快取在靠近使用者位置的位置。例如,亞馬遜使用 CDN 幾乎可以立即載入產品圖像。
⚡ Client-side caching
:將資料儲存在客戶端裝置(如網頁瀏覽器)上,這可能會導致陳舊資料問題,因為快取的資料可能並不總是最新的。
⚡ Distributed caching
:允許多個伺服器分擔儲存和檢索資料的工作量。
還有一些快取策略可以提高效能,例如:
⚡ Cache Aside (lazy loading)
:它首先檢查快取中的資料。如果資料不存在(快取未命中),它將從資料庫中檢索資料並填充快取以供將來的請求。最大限度地減少快取大小並確保僅儲存常用資料。
⚡ Cache Invalidation
:透過使用基於時間的過期或事件驅動的更新來更新過時的資料。
⚡ Data Partitioning
:根據特定條件(例如使用者 ID 或地理位置)對快取進行分區。
⚡ Write Through
:資料更新時,同時寫入快取和資料庫。
⚡ Write Behind
:資料先寫入緩存,稍後再寫入資料庫。如果快取管理不當,這可能會導致不一致。
⚡ Adaptive Caching
:根據即時資料存取模式、流量負載或使用的資源動態調整快取策略。
⚡ Cache Aggregation
:將多個快取條目組合成一個統一的回應,減少多次查找的開銷。主要用於 API 或微服務。
⚡ Cache Stampede Prevention
:確保快取過期時對相同資料的多個請求不會壓垮後端。 locking
、 request collapsing
或early recomputation
等技術可以提供幫助。
還有很多策略,例如Content-aware caching
、 Multi-Level Caching
、 Cache Warm-Up
,但了解這些概念的開發人員並不多。
如果您有興趣了解更多訊息,有一篇關於快取策略的非常有趣的文章,其中為您提供了快取類型、策略、現實生活中的範例,甚至使用這些技術的程式碼範例。強烈推薦!
有一個非常好的博客,涵蓋了系統設計面試的 9 種快取策略。
透過策略性地使用緩存,您可以擴展後端,而無需消耗伺服器資源。
😮 哇!為了擴展後端,需要實現很多東西。這真的值得嗎?簡短的回答是「是」。
我希望這些將為您擴展後端奠定堅實的基礎。
祝你有美好的一天!直到下次:)
我還經營一個開發人員和技術作家的國際社群(250 多名成員),我在那裡分享我學到的一切。您可以透過dub.sh/opensouls加入。
原文出處:https://dev.to/anmolbaranwal/7-steps-to-building-scalable-backend-from-scratch-fp8