揭露:這篇文章包含附屬連結;如果您透過本文中提供的不同連結購買產品或服務,我可能會獲得補償。
image_credit - ByteByteGo
朋友們大家好,如果您正在準備系統設計面試,那麼您必須準備的一個概念是負載平衡演算法。就像API 閘道、快取、速率限制器和分散式訊息佇列一樣,這是您必須熟悉的系統設計基礎知識之一。
在雲端運算、分散式系統和網路架構的現代世界中,負載平衡在確保最佳效能、可靠性和可擴展性方面發揮著重要作用。
無論是處理網路流量、分配運算任務或管理資源利用率,負載平衡演算法的有效性直接影響整個系統的效率和穩定性。
過去,我分享過10 個面試和問題的系統設計主題,負載平衡就是其中之一。
這也是水平可擴展性的先決條件之一,因為為了實現橫向擴展或水平擴展,您必須有一個負載平衡器來將流量分配到不同的節點或伺服器。
雖然我們大多數人都熟悉負載平衡器,但很少人知道負載平衡器如何運作或什麼是負載平衡演算法?很少有程式設計師知道循環演算法,其中一條訊息發送到一台伺服器,下一則訊息發送到另一台伺服器,但是有許多我們不知道的高級負載平衡演算法,本文將向您解釋這些演算法。
這也是系統設計面試最重要的議題之一。在設計他們詢問的系統(例如 YouTube 或 Netflix)時,您要么會被問到概念,要么需要展示您對負載平衡器和負載平衡演算法的了解。
順便說一句,如果您正在準備系統設計面試並想要深入學習系統設計,那麼您還可以查看ByteByteGo 、 Design Guru 、 Exponent 、 Educative 、 Codemia.io和Udemy等網站,它們有許多很棒的系統設計課程
而且,這裡還有一個很好的系統設計模板,它突出顯示了 API 網關和負載平衡器等基本軟體架構元件,可用於設計任何系統。
PS 繼續閱讀直到最後。我有一份免費獎金給你。
以下有 8 種基本的負載平衡演算法,工程師在準備系統設計面試時必須了解這些演算法。
循環演算法以循環方式執行,將傳入請求均勻分佈在伺服器池中。它從第一台伺服器開始按順序分配請求,並在到達最後一台伺服器後循環返回,確保工作負載的公平分配。
此演算法最大的好處是實現簡單,保證請求的公平分配,與同等容量的伺服器配合良好。這是可預測且易於理解的。
不過,它也有缺點,因為它沒有考慮伺服器負載或請求複雜性,這可能導致實踐中分佈不均。
當您擁有具有相似硬體的同質伺服器環境並且請求的複雜性和資源需求通常一致時,循環演算法效果最佳。
這是一個很好的圖表,顯示了循環演算法的工作原理:
最少連接演算法按照最小化伺服器負載的原則執行,將傳入請求定向到活動連接最少的伺服器。
此策略的目的是在伺服器之間均勻分配工作負載,防止任何單一節點過載。
以下是該演算法的優缺點:
優點:允許根據伺服器容量進行分配,比簡單的循環更靈活。
缺點:仍然沒有考慮即時伺服器負載或請求複雜性。
何時使用:當您的伺服器基礎架構是異質的、具有不同的容量,但請求複雜性相對統一時,請使用此演算法。
這是一個很好的圖表,顯示了最少連接演算法如何分配負載:
加權循環演算法認識到各個伺服器的不同容量,因此根據每個伺服器的功能為其分配權重。
然後,請求將按比例分配給這些權重,確保更強大的伺服器處理更大份額的工作負載。
這是一個很好的圖表,顯示了加權循環演算法的工作原理:
該演算法結合了最少連接和加權循環的原理,將請求定向到活動連接與其分配權重比例最低的伺服器。
透過考慮伺服器容量和當前負載,它優化了整個基礎架構的資源利用率。
這是一個很好的圖表,解釋了加權最小連接演算法如何分配負載:
IP 雜湊演算法專注於會話持久性和維護客戶端-伺服器關聯性,根據來源和/或目標 IP 位址確定請求的目標伺服器。
這種方法確保來自同一客戶端的請求一致地路由到同一台伺服器,從而促進有狀態的通訊。
以下是這個負載平衡演算法的優缺點:
優點:確保會話持久性,這對於有狀態應用程式至關重要。適合客戶端IP不常變化的場景。
缺點:如果許多使用者來自相同 IP 範圍,可能會導致分佈不均勻。
在以下情況下使用:您需要會話黏性,並且您的應用程式未設計為無狀態。
這是一個很好的圖表,顯示了 IP 負載平衡演算法的工作原理:
效率和回應能力在分散式系統中至關重要,最小回應時間演算法會優先考慮回應時間最短和活動連接最少的伺服器。
透過將請求定向到效能最快的節點,它可以增強用戶體驗並優化資源利用率。
以下是此LB演算法的優點和缺點:
好處:同時考慮活動連線數和回應時間,提供負載和效能的良好平衡。
缺點:實作起來更複雜,並且可能會佔用負載平衡器更多的資源。
使用時機:您擁有一組具有不同效能特徵的多樣化應用程式,並且想要優化使用者體驗。
這是一個很好的圖表,顯示了最小響應時間演算法的工作原理:
隨機演算法的簡單性滿足了不可預測性,其中傳入的請求被隨機分配給池中的伺服器。
雖然缺乏其他演算法的複雜性,但隨機負載平衡仍然可以在某些情況下提供基本層級的分佈。
該圖很好地直觀地解釋了隨機演算法如何在多個伺服器之間分配流量:
在頻寬敏感的環境中,最小頻寬演算法動態地將請求導向至目前使用最少網路頻寬的伺服器。
透過防止網路擁塞並確保高效的資料傳輸,促進平穩執行和穩定性。
這是一個很好的圖表,顯示了最小頻寬負載平衡演算法的工作原理:
現在,讓我們來看看一些與負載平衡演算法相關的系統設計面試問題
在大規模基礎設施中,使用最廣泛、最高效的負載平衡演算法往往是加權輪詢(Weighted Round Robin) 。
該演算法以循環順序將傳入請求分佈在多個伺服器上,但根據伺服器的容量為伺服器分配不同的權重更加複雜。
它因其簡單性和有效性的平衡而廣受歡迎,尤其是在伺服器功能各異的異質環境中。
下面是它的工作原理?
然而,負載平衡演算法的選擇通常取決於特定的基礎設施需求。
其他高效選項包括最少連接方法(將流量引導到具有最少活動連接的伺服器),以及更先進的自適應演算法(使用即時效能指標來做出路由決策)。
許多大規模營運實際上採用了多種方法的組合,通常使用針對地理分佈進行全局負載平衡的分層方法,然後在網路和應用程式層級使用更具體的演算法。
最少連接法和循環法都是流行的負載平衡演算法,但它們的運作原理不同。
循環法在所有伺服器上依序分配請求,假設容量和負載相等。
當伺服器具有相似的規格並且請求相當統一時,它很簡單且效果很好。
另一方面,最少連接方法將新請求定向到活動連接最少的伺服器。這使得它更能適應不同的伺服器負載和請求複雜性。
當您有長期連線或要求的處理時間變化很大時,您可以選擇「最少連線」 。
在某些請求比其他請求需要更長的處理時間的情況下,它特別有效,因為它有助於防止任何單一伺服器不堪重負。
在請求和伺服器容量相對統一的環境中,或在簡單性和可預測性至關重要的情況下,循環法更可取。
黏性會話,也稱為會話關聯,是一種負載平衡技術,其中來自特定客戶端的一系列請求始終路由到處理初始請求的相同伺服器。
這通常是透過為客戶端建立唯一的會話 ID 並將其與特定伺服器關聯來實現的。
黏性會話的主要優點是維護非無狀態應用程式的狀態,確保依賴伺服器端資料的會話具有一致的使用者體驗。
它對於將會話資料儲存在伺服器記憶體中而不是共享資料庫中的應用程式特別有用。
然而,黏性會話也有缺點。如果某些使用者的會話特別長或資源密集型,它們可能會導致負載分佈不均勻。
它們還使擴展和故障轉移過程變得複雜,因為伺服器的故障可能會中斷分配給它的所有活動會話。
在現代系統設計中,趨勢是無狀態應用程式並將會話資料儲存在分散式快取或資料庫中,這減少了對黏性會話的需求,並允許更靈活、更有彈性的架構。
並且,這裡列出了最佳系統設計面試書籍、線上課程和練習網站,您可以查看這些內容以更好地為系統設計面試做好準備。
DesignGuru 的 Grokking 系統設計課程:一個互動式學習平台,提供實作練習和真實場景,以增強您的系統設計技能。
Codemia.io :這是另一個練習面試系統設計問題的好平台。它有超過 120 多個系統設計問題,其中許多是免費的,並且還有解決這些問題的適當結構。
Alex Xu 的《系統設計面試》 :本書深入探討了系統設計概念、策略和麵試準備技巧。
Martin Kleppmann 的「設計資料密集型應用程式」 :綜合指南,涵蓋了設計可擴展且可靠的系統的原則和實踐。
LeetCode 系統設計 標籤:LeetCode 是一個受歡迎的技術面試準備平台。 LeetCode 上的系統設計標籤包含各種練習問題。
GitHub 上的「系統設計入門」 :精選的資源列表,包括文章、書籍和影片,可幫助您準備系統設計面試。
Educative 的系統設計課程:一個互動式學習平台,提供實作練習和真實場景,以增強您的系統設計技能。
高可擴展性部落格:此部落格包含有關高流量網站和可擴展系統架構的文章和案例研究。
YouTube 頻道:請參閱「Gaurav Sen」和「Tech Dummies」等頻道,以取得有關係統設計概念和麵試準備的富有洞察力的影片。
ByteByteGo :Alex Xu 的一本現場書籍和課程,用於系統設計面試準備。它包含《系統設計訪談》第一捲和第二卷的所有內容,並將隨即將推出的第三卷進行更新。
Exponent :一個專為面試準備的網站,特別是針對亞馬遜和谷歌等 FAANG 公司,他們還有很棒的系統設計課程和許多其他材料,可以幫助您破解 FAANG 面試。
image_credit - ByteByteGo
您還應該記住,透過參與實際專案和參加模擬面試,將理論知識與實際應用結合。不斷的練習和學習無疑會提高你在系統設計面試中的熟練程度。
這就是軟體開發人員在系統設計面試中應該了解的8 種基本負載平衡演算法的全部內容。掌握這些負載平衡演算法可以為工程師提供設計彈性和高性能分散式系統所需的工具。
透過了解這些演算法,您可以優化資源利用率、增強可擴展性並確保跨不同網路環境的無縫用戶體驗。
而且,在選擇正確的負載平衡演算法時,它取決於您的特定基礎架構、應用程式要求和流量模式。
在實踐中,許多大型系統使用這些方法的組合,有時在其基礎設施的不同層級(例如,全局負載平衡與應用程式層級平衡)採用不同的演算法來實現最佳效能和可靠性。
正如承諾的,這是給你的獎金,一本免費的書。我剛剛找到一本新的免費書籍來學習分散式系統設計,您也可以在 Microsoft 上閱讀它 --- https://info.microsoft.com/rs/157-GQE-382/images/EN-CNTNT -eBook-設計分散式系統.pdf
謝謝
原文出處:https://dev.to/somadevtoo/system-design-basics-load-balancing-algorithms-2559