後端工程師面試考什麼 — Load Balancer vs. Reverse Proxy vs. API Gateway vs. HAProxy

Posted on  Sep 11, 2024  in  後端面試準備  by  Amo Chen  ‐ 5 min read

後端工程師在日常工作或面試中,常常會遇到以下幾種技術與工具:

  • Load Balancer
  • Reverse Proxy
  • API Gateway
  • HAProxy

這些技術的共通點是它們都處於承載流量的第一線,但在用途上卻各有不同,因此容易產生混淆。

本文將釐清這些技術與工具的差異,以理解它們各自的功能與應用場景,避免常見的誤解。

Load Balancer / 負載平衡器

Load Balancer 如其名,它負責分配來自網路的 requests,將這些 requests 分配到多個伺服器(servers),除了可以有效分散處理 requests 的壓力,避免單一伺服器負載(load)過高,還能讓後端伺服器群具備彈性擴充能力,提升系統的可擴充性。

Load Balancer 的功能可以由硬體設備提供,稱為 Hardware Load Balancer Device (HLD),也可以由軟體提供(例如 Nginx )。

常見的 load balancer 運作原理是 request 會首先發送給 load balancer,然後由 load balancer 將 request 轉發給後端伺服器並接收伺服器的 response,最後 load balancer 再將 response 傳給使用者。由於使用者始終與 load balancer 互動,因此我們可以靈活地擴充後端伺服器的數量,只需調整 load balancer 的設定,即可提升系統處理 request 的能力。

load-balancer.png

有人可能會疑問「在此架構下,如果 load balancer 被大量 requests, responses 阻塞的話,不就會對系統的可用性與穩定性造成影響?」。

沒有錯,所以 load balancer 還有 1 種稱為 Direct Routing (DR) 的技術,也稱為 Direct Server Return,可以讓後端伺服器直接回應使用者。其原理是 load balancer 透過修改網路封包,將 request 直接轉給後端伺服器,讓後端伺服器能夠直接回應使用者。這種模式相當適合用於影音資料傳輸的情況,但網路設定上也比較複雜一些。

direct-routing.png

除了前述運作原理之外,也有使用不同運作原理的 load balancer:

  • DNS (Domain Name System) based load balancing,主要在 DNS 解析域名的階段回應不同 IP 給使用者以進行負載平衡,缺點是 DNS 更新需要較長時間,對於擴充彈性帶來很大的不方便
  • HTTP redirects,使用 HTTP 重新導向(redirection)進行分配的 load balancer, 缺點是使用者端會發出 2 次 request,第 1 次會得到需要重新導向的 response,第 2 次才能取得真正的 response,整體而言回應速度較慢

而談到 Load Balancer 時也多半會需要對分配策略有所了解,常見的分配策略有:

  • 輪詢(Round Robin),輪流分配 request 給每個伺服器
  • 最少連線數(Least Connection),將 request 分配給目前連線數最少的伺服器
  • 最快回應時間(Least Response Time),將 request 分配給回應速度最快的伺服器
  • IP 雜湊(Hash),將 IP 位址進行雜湊後分配給特定伺服器,同 IP 會由同 1 個伺服器提供服務
  • 隨機(random)

load-balancing-algorithms.gif

ref: DesignGurus

不同的分配策略有各自的優缺點與適用的場景,更完整詳細的解說可以參考 Load Balancing Algorithms 1 文。

Load Balancer 設定範例

以下是使用 Nginx 作為 HTTP load balancer 的設定,使用最少連線數分配策略:

http {
    upstream backend {
        least_conn;
        server backend1.example.com;
        server backend2.example.com;
    }

    server {
        location / {
            proxy_pass http://backend;
        }
    }
}

從上述設定應該更能明顯體會 load balancer 的運作。

Reverse Proxy / 反向代理伺服器

容易與 load balancer 混淆的大概是 reverse proxy。

原因是 reverse proxy 通常也會同時扮演 load balancer 的角色,例如 Nginx 就同時提供 reverse proxy 與 load balancer 2 種功能可以使用,而且它們在後端系統架構的位置也很相似。

reverse-proxy.png

不過 load balancer 專注於分配 requests 給多個伺服器;而 reverse proxy 專注於接收 requests,並根據 requests 的不同(例如根據 HTTP request 的 path),轉給不同的伺服器處理,從以下 Nginx 設定可以感受到其差異,例如 load balancer 並不管 location 的差異:

http {
    upstream backendv1 {
        least_conn;
        server backend1.example.com;
        server backend2.example.com;
    }

    server {
        location /api/v1/ {
            proxy_pass http://backendv1;
        }

        location /api/v2/ {
            proxy_pass http://backend3.example.com:8000;
        }
    }
}

畫成圖表示的話:

reverse-proxy-and-load-balancer.png

而且 reverse proxy 還有個特點是能夠進行快取,將特定的 response 快取起來,減少後端伺服器的負擔,並提升 response 的速度,例如下列 Nginx 設定:

http {
    proxy_cache_path  /var/www/cache levels=1:2 keys_zone=one:10m;
    proxy_temp_path /var/www/cache/tmp;

    upstream backendv1 {
        least_conn;
        server backend1.example.com;
        server backend2.example.com;
    }

    server {
        location /api/v1/ {
            proxy_pass http://backendv1;
        }

        location /api/v2/ {
            proxy_pass http://backend3.example.com:8000;
        }

        location /static/ {
           proxy_pass http://static.example.com;
           proxy_cache one;
           proxy_cache_valid  200 302  10m;
           proxy_cache_valid  404      1m;
        }
    }
}

常見問題:正向代理 vs. 反向代理

正向代理伺服器(Forward Proxy)是使用者能夠設定使用的代理伺服器,通常靠近使用者端;而反向代理伺服器(Reverse Proxy)是使用者不能設定使用的,屬於服務後端系統中的一部分。

從使用者的角度來看,使用者是對反向代理伺服器發出 request,然後反向代理伺服器又將 request 轉發給後端伺服器,並接收後端伺服器的 response 之後,再回傳給使用者。

詳見 What is a reverse proxy? | Proxy servers explained

API Gateway

API Gateway 與 load balancer, reverse proxy 相似,都位於流量第一線。

不過 API Gateway 主要應用於接受各種 API requests,並根據預先定義的規則將請求轉發至指定的伺服器進行處理。API Gateway 通常應用於微服務(microservices)架構,在微服務架構下,會由多個服務(services)協同提供 API 服務,而 API Gateway 則扮演對外的統一窗口,此種架構同樣可以為後端系統帶來彈性。

下圖將 API Gateway 表達很好,可以清楚理解它的作用:

api-gateway.svg

ref: What Is an API Gateway? A Quick Learn Guide

除了接受各種 API requests 之外,API gateway 也可能會提供以下功能(視各家服務而定):

  • 安全控管機制,包含認證、授權、存取控制、加密等等
  • 監控機制,例如延遲(latency)、錯誤率、呼叫次數等資訊
  • 資源控管,例如限流機制(rate limiting)
  • 負載平衡(load balancing)

常見的 API Gateway 解決方案為 NGINX Ingress Controller(需搭配 K8s)、Amazon API Gateway 等等。

更多關於 API Gateway 介紹,詳見 What Is an API Gateway? A Quick Learn Guide

HAProxy

HAProxy 是 1 個常用的開源負載平衡和反向代理伺服器,主打高可用、高效能,甚至提供 TCP 與 HTTP 的代理功能。所以 HAProxy 不是 1 種技術,而是 1 個開源軟體。

總結

本文整理了我在準備系統設計時遇到的疑問,這些技術和工具的功能確實存在部分重疊,因此產生混淆是很常見的事。不過,只要釐清它們的差異與應用場景,就能在面試中做出更合理的設計與說明

以上!

Enjoy!

References

Load Balancing Algorithms | Design Guru

8 Load Balancing Algorithms for Distributed Systems

What is DNS-based load balancing? | DNS load balancing

HTTP redirects

Direct Server Return

What is a reverse proxy? | Proxy servers explained

What Is an API Gateway? A Quick Learn Guide

對抗久坐職業傷害

研究指出每天增加 2 小時坐著的時間,會增加大腸癌、心臟疾病、肺癌的風險,也造成肩頸、腰背疼痛等常見問題。

然而對抗這些問題,卻只需要工作時定期休息跟伸展身體即可!

你想輕鬆改變現狀嗎?試試看我們的 PomodoRoll 番茄鐘吧! PomodoRoll 番茄鐘會根據你所設定的專注時間,定期建議你 1 項辦公族適用的伸展運動,幫助你打敗久坐所帶來的傷害!

贊助我們的創作

看完這篇文章了嗎? 休息一下,喝杯咖啡吧!

如果你覺得 MyApollo 有讓你獲得實用的資訊,希望能看到更多的技術分享,邀請你贊助我們一杯咖啡,讓我們有更多的動力與精力繼續提供高品質的文章,感謝你的支持!