Skip to content

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

#GatewayNgôn ngữLicensePhát hành đầuGitHub Stars
1Nginx (OSS)CBSD-2200426k+
2HAProxyCGPL-220015k+
3TraefikGoMIT201553k+
4CaddyGoApache-2201560k+
5EnvoyC++Apache-2201625k+
6Kong (OSS)Lua/NginxApache-2201540k+
7Apache APISIXLua/NginxApache-2201914k+
8KrakenD (CE)GoApache-220172k+

Benchmark Hiệu năng

Dựa trên các test K8s Ingress Controller độc lập:

GatewayRPSP99 LatencyCPU UsageMemoryLỗi khi Stress
HAProxy~42,000Thấp nhất~50%~50MB0
Nginx~15,200ThấpTrung bình~80MBThấp
Traefik~19,000Trung bìnhỔn định~100MB1,342
Envoy~18,500Thấp-Trung bình~73%~150MBThấp
KrakenD~70,000*Thấp nhất4-6%~30MBN/A
Kong~15,000Cao (1032ms trung bình)Cao~200MB+Trung bình
APISIX~18,000Trung bình (1025ms trung bình)Trung bình~100MBThấp
Caddy~12,000Trung bìnhTrung bình~60MBThấ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ăngNginx OSSHAProxyTraefikCaddyEnvoyKong OSSAPISIXKrakenD CE
Docker Label DiscoveryKhôngBên thứ 3Nguyên bảnKhôngKhôngKhôngKhôngKhông
K8s Ingress ControllerCó (EOL Mar 2026!)WIP
K8s Gateway APIKhôngCó (nguyên bản)KhôngCó (nguyên bản)Không
Circuit BreakerKhôngKhôngKhôngPluginPlugin
Rate LimitingBên thứ 3Cơ bảnKhôngPluginPlugin
Active Health ChecksKhông (trả phí)KhôngKhông
Retry/TimeoutGiới hạnKhôngCó (nâng cao)PluginPlugin
WebSocketChỉ Enterprise!
gRPC
HTTP/3 (QUIC)Có (exp.)KhôngKhông
Auto TLS (ACME)KhôngKhôngCó (tốt nhất)KhôngKhôngKhôngKhông
Built-in MetricsKhôngStatsCó (Prometheus)PluginPlugin
Dashboard/UIKhôngTrang statsCó (tích hợp)KhôngAdmin APITrả phíMiễn phíKhông
Security HeadersThủ côngThủ côngCó (middleware)Thủ côngCó (filter)PluginPlugin
Hot Reloadnginx -s reloadreloadTự độngTự độngxDS APIDB-drivenetcd/YAMLFile reload
Stateless (no DB)Không (PostgreSQL)Cần etcd
Config ComplexityTrung bìnhTrung bìnhThấp (labels/YAML)ThấpCaoTrung bìnhTrung bìnhThấp
Learning CurveThấpTrung bìnhThấpRất ThấpCaoTrung bìnhTrung bìnhThấp

Tiêu chí Loại trừ Quyết định cho BANA

Ứng viênLý do loạiMức độ
Nginx OSSK8s 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
CaddyK8s 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 CEHỗ 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 OSSYê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 APISIXYê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
EnvoyConfig 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ố)TraefikHAProxyEnvoy
Workflow Docker-first (25%)521
Sẵn sàng K8s Gateway API (20%)545
Resilience tích hợp (15%)535
Hiệu năng/hiệu suất (15%)354
Đơn giản vận hành (15%)531
Observability tích hợp (10%)525
Tổng có Trọng số4.603.153.10

So sánh Lộ trình Migration

PhaTraefikHAProxyEnvoy
Docker Compose (hiện tại)Labels → tự khám pháEasyHAProxy labels hoặc cfg thủ côngenvoy.yaml thủ công theo dịch vụ
Migration K8sLabels → 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 meshIstio/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ì:

  1. 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
  2. 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
  3. 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
  4. Prometheus metrics và dashboard tích hợp — không cần exporter hay sidecar bổ sung
  5. Đơn giản vận hành — toàn bộ cấu hình gateway vừa trong một file traefik.yml cộ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ệuMô tả
Tổng quan GatewayThẻ định danh + service catalog
Kiến trúcGóc nhìn C4, luồng request-routing
RoutingDocker label routing, 3 mẫu routing
ADR-0001Quyết định routing động dựa-trên-label Traefik
Quyết địnhTất cả ADRs

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.