Bài 6: gRPC-Web, Load Balancing và Best Practices khi đưa vào Production
1. gRPC-Web là gì? (Giải quyết bài toán Frontend)
Như bạn đã biết, gRPC hoạt động dựa trên nền tảng HTTP/2. Tuy nhiên, các trình duyệt web hiện tại (Chrome, Safari, Firefox...) không hỗ trợ đầy đủ việc kiểm soát các khung HTTP/2 cấp thấp cần thiết cho gRPC (như việc thiết lập các thiết lập HTTP/2 tùy chỉnh hoặc đọc trực tiếp frame nhị phân).
-
Giải pháp - gRPC-Web: Đây là một công nghệ/thư viện cho phép các ứng dụng Web Frontend (React, Vue, Angular) có thể gọi trực tiếp các dịch vụ gRPC.
-
Cách hoạt động: Trình duyệt sẽ gửi request qua HTTP/1.1 hoặc HTTP/2 thông thường tới một Proxy (phổ biến nhất là Envoy Proxy hoặc một gRPC-Web proxy nhẹ nhàng). Proxy này sẽ dịch request đó sang định dạng gRPC chuẩn rồi chuyển tiếp xuống hệ thống Microservices phía sau.
2. Load Balancing (Cân bằng tải) trong gRPC
Cân bằng tải cho gRPC phức tạp hơn so với REST API thông thường, lý do nằm ở HTTP/2:
-
Trong REST (HTTP/1.1), một client mở nhiều kết nối TCP riêng biệt, nên Load Balancer truyền thống (Layer 7 như Nginx thông thường) có thể dễ dàng phân phối từng request riêng lẻ sang các server khác nhau.
-
Trong gRPC, tất cả các request đều được ghép kênh (Multiplexing) chạy chung trên MỘT kết nối TCP duy nhất. Nếu dùng Load Balancer tầng 4 (Layer 4 - TCP), toàn bộ request từ một client sẽ chỉ bị kẹt cứng ở một server duy nhất, gây mất cân bằng tải trầm trọng.
💡 Các giải pháp Load Balancing cho gRPC hiện nay:
-
Client-side Load Balancing (Cân bằng tải phía Client): Client tự quản lý danh sách các IP của server (thường kết hợp với Service Discovery như Consul, ZooKeeper, Kubernetes DNS) và tự động phân phối các kết nối TCP hoặc stream sang các server khác nhau.
-
L7 Proxy chuyên dụng: Sử dụng các proxy hiểu rõ gRPC/HTTP/2 như Envoy Proxy, Linkerd, hoặc Traefik. Các proxy này có khả năng nhìn thấu vào bên trong kết nối HTTP/2 để cân bằng tải đến từng RPC call riêng lẻ.
3. Best Practices (Kinh nghiệm thực chiến khi dùng gRPC)
Khi đưa gRPC vào hệ thống lớn chạy thật (Production), bạn nên nằm lòng các nguyên tắc sau:
-
1. Luôn luôn cấu hình Timeout (Deadline): Trong Microservices, việc một service bị treo có thể làm dây chuyền sập toàn bộ hệ thống. gRPC hỗ trợ cơ chế
Deadline. Client bắt buộc phải truyền timeout cho mọi request (ví dụ:ctx, cancel := context.WithTimeout(ctx, 2*time.Second)). Nếu quá thời gian, request sẽ tự động bị hủy để giải phóng tài nguyên. -
2. Quản lý phiên bản file
.proto(Versioning):-
Không bao giờ sửa đổi hoặc xóa các Field Tag cũ đã được phát hành.
-
Nếu muốn thay đổi lớn, hãy tạo message mới hoặc đổi tên package/service (ví dụ:
user.v1.UserServicelênuser.v2.UserService).
-
-
3. Bật Health Checking: Sử dụng chuẩn
gRPC Health Checking Protocolcó sẵn để các công cụ quản lý như Kubernetes (K8s) biết chính xác khi nào service sẵn sàng nhận traffic hoặc khi nào nó đang gặp sự cố để restart. -
4. Hạn chế dùng Payload quá lớn: gRPC sinh ra để truyền tải các gói tin nhỏ, nhanh. Nếu bạn định dùng gRPC để upload/download các file nặng hàng GB qua mạng mà không chia nhỏ thành các stream (chunk) hợp lý, bạn sẽ gặp vấn đề về bộ nhớ (RAM) và hiệu năng mạng.
🎉 Tổng kết toàn bộ Series gRPC:
Bài 1: Hiểu gRPC là gì và sức mạnh của HTTP/2 + Protobuf so với REST/JSON.
Bài 2: Nắm bắt cấu trúc file
.protovà cách dùng Field Tag tối ưu hóa dữ liệu.Bài 3: Khai thác 4 loại Streaming (Unary, Server, Client, Bidirectional) cho real-time.
Bài 4: Thực chiến dựng code Go cho Client-Server gRPC.
Bài 5: Bảo mật (TLS, Token/Metadata), chuẩn hóa Status Codes và viết Interceptors.
Bài 6: Giải quyết bài toán Frontend với gRPC-Web, Load Balancing HTTP/2 và kinh nghiệm Production.
Toàn bộ lộ trình 6 bài học về gRPC đã hoàn tất!
All Rights Reserved