Gateway Selection Report
Tổng quan
Báo cáo này đánh giá 8 ứng viên API gateway cho hệ thống BANA POS. Gateway đóng vai trò điểm vào duy nhất cho mọi traffic bên ngoài, route request tới đúng microservice backend trong khi cung cấp resilience và observability.
Chiến lược Routing: Service-Owned Prefix — mỗi dịch vụ đặt APP_ENV_SERVER_BASE_PATH=/v1/api/<service>. Tự đăng ký Docker label/annotation — mỗi dịch vụ khai báo route riêng. Không config route trung tâm.
Kiến trúc: Nginx cấp host (TLS + domains) → Traefik (Docker, :30080, routing dịch vụ + resilience + observability) → Dịch vụ Backend.
Ứng viên
| # | Gateway | Ngôn ngữ | License | Phát hành đầu | GitHub Stars |
|---|---|---|---|---|---|
| 1 | Nginx (OSS) | C | BSD-2 | 2004 | 26k+ |
| 2 | HAProxy | C | GPL-2 | 2001 | 5k+ |
| 3 | Traefik | Go | MIT | 2015 | 53k+ |
| 4 | Caddy | Go | Apache-2 | 2015 | 60k+ |
| 5 | Envoy | C++ | Apache-2 | 2016 | 25k+ |
| 6 | Kong (OSS) | Lua/Nginx | Apache-2 | 2015 | 40k+ |
| 7 | Apache APISIX | Lua/Nginx | Apache-2 | 2019 | 14k+ |
| 8 | KrakenD (CE) | Go | Apache-2 | 2017 | 2k+ |
Benchmark Hiệu năng
Dựa trên các test K8s Ingress Controller độc lập:
| Gateway | RPS | P99 Latency | CPU Usage | Memory | Lỗi khi Stress |
|---|---|---|---|---|---|
| HAProxy | ~42,000 | Thấp nhất | ~50% | ~50MB | 0 |
| Nginx | ~15,200 | Thấp | Trung bình | ~80MB | Thấp |
| Traefik | ~19,000 | Trung bình | Ổn định | ~100MB | 1,342 |
| Envoy | ~18,500 | Thấp-Trung bình | ~73% | ~150MB | Thấp |
| KrakenD | ~70,000* | Thấp nhất | 4-6% | ~30MB | N/A |
| Kong | ~15,000 | Cao (1032ms trung bình) | Cao | ~200MB+ | Trung bình |
| APISIX | ~18,000 | Trung bình (1025ms trung bình) | Trung bình | ~100MB | Thấp |
| Caddy | ~12,000 | Trung bình | Trung bình | ~60MB | Thấp |
*70k RPS của KrakenD là benchmark riêng của họ (stateless, không overhead K8s). Nên dè dặt so với test độc lập.
Ma trận Tính năng
| Tính năng | Nginx OSS | HAProxy | Traefik | Caddy | Envoy | Kong OSS | APISIX | KrakenD CE |
|---|---|---|---|---|---|---|---|---|
| Docker Label Discovery | Không | Bên thứ 3 | Nguyên bản | Không | Không | Không | Không | Không |
| K8s Ingress Controller | Có (EOL Mar 2026!) | Có | Có | WIP | Có | Có | Có | Có |
| K8s Gateway API | Không | Có | Có (nguyên bản) | Không | Có (nguyên bản) | Có | Có | Không |
| Circuit Breaker | Không | Không | Có | Không | Có | Plugin | Plugin | Có |
| Rate Limiting | Bên thứ 3 | Cơ bản | Có | Không | Có | Plugin | Plugin | Có |
| Active Health Checks | Không (trả phí) | Có | Có | Không | Có | Có | Có | Không |
| Retry/Timeout | Giới hạn | Có | Có | Không | Có (nâng cao) | Plugin | Plugin | Có |
| WebSocket | Có | Có | Có | Có | Có | Có | Có | Chỉ Enterprise! |
| gRPC | Có | Có | Có | Có | Có | Có | Có | Có |
| HTTP/3 (QUIC) | Có | Có | Có (exp.) | Có | Có | Không | Có | Không |
| Auto TLS (ACME) | Không | Không | Có | Có (tốt nhất) | Không | Không | Không | Không |
| Built-in Metrics | Không | Stats | Có (Prometheus) | Có | Có | Plugin | Plugin | Có |
| Dashboard/UI | Không | Trang stats | Có (tích hợp) | Không | Admin API | Trả phí | Miễn phí | Không |
| Security Headers | Thủ công | Thủ công | Có (middleware) | Thủ công | Có (filter) | Plugin | Plugin | Có |
| Hot Reload | nginx -s reload | reload | Tự động | Tự động | xDS API | DB-driven | etcd/YAML | File reload |
| Stateless (no DB) | Có | Có | Có | Có | Có | Không (PostgreSQL) | Cần etcd | Có |
| Config Complexity | Trung bình | Trung bình | Thấp (labels/YAML) | Thấp | Cao | Trung bình | Trung bình | Thấp |
| Learning Curve | Thấp | Trung bình | Thấp | Rất Thấp | Cao | Trung bình | Trung bình | Thấp |
Tiêu chí Loại trừ Quyết định cho BANA
| Ứng viên | Lý do loại | Mức độ |
|---|---|---|
| Nginx OSS | K8s Ingress Controller EOL tháng 3 2026. Không circuit breaker, không active health check, không rate limiting, không metrics trong OSS. Không Docker label discovery. | CRITICAL |
| Caddy | K8s Ingress Controller là WIP/non chín. Không circuit breaker, không rate limiting, không active health check. Không Docker label discovery. | HIGH |
| KrakenD CE | Hỗ trợ WebSocket chỉ Enterprise (trả phí). Bắt buộc cho dịch vụ signal. Không Docker label discovery. Không hỗ trợ K8s Gateway API. | CRITICAL |
| Kong OSS | Yêu cầu database PostgreSQL (overhead vận hành). Dấu chân tài nguyên nặng nhất (~200MB+). Phụ thuộc plugin cho hầu hết tính năng. | MEDIUM |
| Apache APISIX | Yêu cầu cụm etcd (hoặc chế độ YAML standalone). Không Docker label discovery. Thiết lập phức tạp hơn cần thiết. | MEDIUM |
| Envoy | Config phức tạp nhất (xDS, YAML clusters/listeners). Không Docker label discovery. Thiết kế cho service mesh, quá mức cho dùng chỉ-gateway. | MEDIUM |
Phân tích Vòng Chung kết
Sau khi loại các ứng viên có lý do loại critical/high, ba ứng viên mạnh còn lại:
Traefik
Điểm mạnh:
- Docker label discovery nguyên bản (khớp đúng mẫu service-owned prefix)
- Hỗ trợ K8s Gateway API nguyên bản (sẵn sàng cho migration K8s)
- Circuit breaker, rate limiting, retry, health check tích hợp (không cần plugin)
- Prometheus metrics + dashboard tích hợp
- Auto TLS với Let's Encrypt
- Hỗ trợ WebSocket nguyên bản
- Config complexity thấp nhất cho workflow Docker-first
- License MIT, cộng đồng lớn (53k stars)
- Dự án CNCF tốt nghiệp
Điểm yếu:
- Không nhanh nhất (19k RPS vs 42k của HAProxy)
- 1,342 lỗi khi stress test cực độ
- Không có tính năng L4 load balancing nâng cao
HAProxy
Điểm mạnh:
- Hiệu năng thô tốt nhất tuyệt đối (42k RPS, không lỗi)
- Latency thấp nhất tại P99
- Dấu chân CPU/memory thấp nhất
- Hỗ trợ K8s Gateway API
- Load balancing L4/L7 nâng cao (sticky session, connection draining)
- 24 năm ổn định đã được thử thách
- Active health check, retry
Điểm yếu:
- Không Docker label discovery nguyên bản (yêu cầu EasyHAProxy bên thứ 3)
- Không circuit breaker tích hợp
- Không auto TLS (ACME)
- Không endpoint Prometheus metrics tích hợp (cần exporter)
- Không dashboard tích hợp (chỉ trang stats)
- File config dài dòng hơn
- EasyHAProxy là dự án cộng đồng, không phải HAProxy chính thức
Envoy
Điểm mạnh:
- Tập tính năng mạnh nhất tổng thể
- Config thời gian thực qua xDS API (thay đổi zero-downtime)
- Cấp năng cho Istio, Consul Connect, AWS App Mesh
- Tốt nhất cho service mesh nếu đi hướng đó
- K8s Gateway API nguyên bản (Envoy Gateway)
- Circuit breaking, outlier detection, retry nâng cao
Điểm yếu:
- Config phức tạp nhất (learning curve dốc)
- Memory usage cao nhất (~150MB)
- Không Docker label discovery
- Quá mức nếu không cần service mesh
- Yêu cầu chuyên môn Envoy đáng kể
Ma trận Chấm điểm
Chấm điểm có trọng số (1-5, cao hơn = tốt hơn cho BANA):
| Tiêu chí (Trọng số) | Traefik | HAProxy | Envoy |
|---|---|---|---|
| Workflow Docker-first (25%) | 5 | 2 | 1 |
| Sẵn sàng K8s Gateway API (20%) | 5 | 4 | 5 |
| Resilience tích hợp (15%) | 5 | 3 | 5 |
| Hiệu năng/hiệu suất (15%) | 3 | 5 | 4 |
| Đơn giản vận hành (15%) | 5 | 3 | 1 |
| Observability tích hợp (10%) | 5 | 2 | 5 |
| Tổng có Trọng số | 4.60 | 3.15 | 3.10 |
So sánh Lộ trình Migration
| Pha | Traefik | HAProxy | Envoy |
|---|---|---|---|
| Docker Compose (hiện tại) | Labels → tự khám phá | EasyHAProxy labels hoặc cfg thủ công | envoy.yaml thủ công theo dịch vụ |
| Migration K8s | Labels → IngressRoute CRDs (cơ học) | Labels → annotations (OK) | YAML → Gateway API CRDs (phức tạp) |
| Service Mesh (tương lai) | Traefik Mesh (tùy chọn) | Không có câu chuyện mesh | Istio/Consul (nguyên bản) |
Quyết định
Đã chọn: Traefik v3.6 (điểm 4.60/5)
Traefik là người thắng rõ ràng cho BANA vì:
- Tự đăng ký Docker label là tính năng nguyên bản — dịch vụ khai báo route riêng qua Docker labels, đạt không config route trung tâm
- K8s Gateway API được hỗ trợ nguyên bản — khi migrate từ Docker Compose sang Kubernetes, việc chuyển đổi từ labels sang IngressRoute CRDs là cơ học
- Mọi tính năng resilience tích hợp — circuit breaker, rate limiting, retry, health check hoạt động ngay mà không cần plugin hay phụ thuộc bên ngoài
- Prometheus metrics và dashboard tích hợp — không cần exporter hay sidecar bổ sung
- Đơn giản vận hành — toàn bộ cấu hình gateway vừa trong một file
traefik.ymlcộng Docker labels trên mỗi dịch vụ
Khoảng cách hiệu năng (19k vs 42k RPS cho HAProxy) là chấp nhận được ở quy mô hiện tại của BANA. Nếu hiệu năng trở thành nút thắt, HAProxy có thể được cân nhắc như một L4 load balancer tương lai đứng trước Traefik.
Trang liên quan
| Tài liệu | Mô tả |
|---|---|
| Tổng quan Gateway | Thẻ định danh + service catalog |
| Kiến trúc | Góc nhìn C4, luồng request-routing |
| Routing | Docker label routing, 3 mẫu routing |
| ADR-0001 | Quyết định routing động dựa-trên-label Traefik |
| Quyết định | Tất cả ADRs |