Web Service Load Balancing

By | February 6, 2016

而家 RESTful web service 及 AJAX 流行,server 同 client 多數用 JSON / Protocol buffers 交換資料。Server side 對 Java EE / J2EE 需求大減,特別是 mobile Apps,更本用不著 Java EE,偏向用 Node.js 或 Python 或 Go 來做 server API。由於在 web API 做 multi-thread 會很麻煩,花大量時間做 development 及 testing,而基於 JavaScript 的 Node.js 更加沒有 multithreading,而是用 callback。

如果想用盡 CPU cores,最容易的方法是把用 Node.js 或 Python 或 Go 寫成的 web API start 多個次,不同 instances listen 不同的 ports (e.g. 8080, 8081, 8082, etc)。再在前面加一層 web service (listen 80) 做 load balancing。

Apache HTTP Server

BalancerMember http://127.0.0.1:8080
BalancerMember http://127.0.0.1:8081
BalancerMember http://127.0.0.1:8082

ProxyPass /hello_world balancer://app_servers/hello_world

nginx

upstream app_servers {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}

location /hello_world {
proxy_pass http://app_servers/hello_world;
}

當然,web API 可以在其他電腦 run,只要把 127.0.0.1 改換便可。達到分散 work load,加大了 server 負荷及速度。此 load balancing 由於只是順住分發 requests,並沒有考慮各 instances 的負荷。就如 supervisor 分發工作 (requests) 給員工 (instances),而沒有理會員工有沒有空閒一樣。要做到得閒的員工 (instances) 主動接 job (requests),那就要用到 message queue 了。