Nginx como proxy reverso, balanceador de carga e rate limiter sobre três réplicas do catalog
catalog
O catalog satura em ~400 req/s e um deploy o derruba. O que resolve os dois de uma vez?
k6 ──► edge :80 (Nginx) ──► catalog-1 ┐ ├─► catalog-2 ├──► db └─► catalog-3 ┘
X-Instance
x-catalog: &catalog build: ./services/catalog image: boxoffice-catalog deploy: { resources: { limits: { cpus: "1.0", memory: 768M } } } services: catalog-1: { <<: *catalog, hostname: catalog-1 } catalog-2: { <<: *catalog, hostname: catalog-2 } catalog-3: { <<: *catalog, hostname: catalog-3 }
upstream catalog { zone catalog 64k; server catalog-1:8082 resolve max_fails=3 fail_timeout=10s; server catalog-2:8082 resolve max_fails=3 fail_timeout=10s; server catalog-3:8082 resolve max_fails=3 fail_timeout=10s; keepalive 64; }
least_conn
resolve
proxy_connect_timeout 1s; proxy_read_timeout 5s; proxy_next_upstream error timeout http_502 http_503 http_504; proxy_next_upstream_tries 2;
stop
pause
Uma réplica morta é fácil. Uma lenta é perigosa: o timeout decide quanto ela custa.
/actuator/health/readiness
Por que não proxy_read_timeout 100ms para pegar réplicas congeladas na hora?
proxy_read_timeout 100ms
limit_req_zone $http_x_api_key zone=per_key:10m rate=20r/s; limit_req zone=per_key burst=40 nodelay; limit_req_status 429;
sub
LIST_SHARE=0
Eficiência de escala = capacidade(3) / (3 × capacidade(1)). Olhe o docker stats: quem está em 100%?
docker stats
db
max_fails
502 no live upstreams
Roteiro: (1) por que escalar horizontalmente; (2) a topologia; (3) réplicas no Compose; (4) nginx.conf; (5) distribuição; (6) falhas: stop vs pause; (7) rate limiting; (8) medir a eficiência do scale-out.