Công nghệ gRPC (Remote Procedure Call) của Google

Công nghệ gRPC (Remote Procedure Call) của Google

1. Giới thiệu về gRPC trên ASP.NET Core

gRPC (trang chủ là https://grpc.io/) là một framework ngôn ngữ bất khả tri, framework Remote Procedure Call (RPC) hiệu suất cao.
Những lợi ích chính của gRPC là:
- Framework RPC hiện đại, nhẹ, hiệu suất cao.
- Phát triển API theo hợp đồng, sử dụng Protocol Buffers (Protobuf) theo mặc định, cho phép triển khai ngôn ngữ bất khả tri.
- Công cụ có sẵn cho nhiều ngôn ngữ để tạo servers và clients được gõ mạnh (strongly-typed).
- Hỗ trợ client, server và các cuộc gọi stream hai chiều.
- Giảm sử dụng mạng với serialization Protobuf nhị phân.
Những lợi ích này làm cho gRPC lý tưởng cho:
- Microservices nhẹ và cần hiệu suất cao.
- Hệ thống polyglot nơi cần nhiều ngôn ngữ để phát triển.
- Các service thời gian thực point-to-point cần xử lý các stream request hoặc response.
Mặc dù triển khai C# hiện có sẵn trên trang chủ gRPC, nhưng triển khai hiện tại phụ thuộc vào thư viện gốc được viết bằng C (gRPC C-core). Họ hiện đang được tiến hành các công việc để cung cấp một triển khai mới dựa trên máy chủ Kestrel HTTP và ngăn xếp ASP.NET Core được quản lý hoàn toàn.
Chi tiết về gRPC và Protobuf xem tại:
- Mở rộng quy mô REST API sử dụng microservices tại https://thongthele.blogspot.com/2018/12/mo-rong-quy-mo-rest-api-su-dung.html

2. So sánh gRPC services với HTTP APIs

Công nghệ được sử dụng để cung cấp API cho ứng dụng là một lựa chọn quan trọng và gRPC cung cấp các lợi ích độc đáo so với HTTP APIs (bao gồm ASP.NET Core Web APIs). Phần này giới thiệu về những điểm mạnh và điểm yếu của gRPC và đề xuất các kịch bản sử dụng gRPC so với các công nghệ khác.

Điểm mạnh của gRPC

Hiệu suất cao:
- Tin nhắn gRPC được tuần tự hóa bằng Protobuf, một định dạng tin nhắn nhị phân hiệu quả. Protobuf tuần tự hóa rất nhanh trên máy chủ và máy khách. Kết quả tuần tự hóa Protobuf dẫn đến tải trọng tin nhắn nhỏ, quan trọng trong các tình huống băng thông hạn chế như ứng dụng di động.
- gRPC được thiết kế cho HTTP/2, một phiên bản chính của HTTP cung cấp các lợi ích hiệu suất đáng kể so với HTTP 1.x: Truyền dữ liệu nhị phân được nén. Giao thức HTTP/2 nhỏ gọn và hiệu quả cả trong việc gửi và nhận. Ghép kênh (Multiplexing) của nhiều cuộc gọi HTTP/2 qua một kết nối TCP. Ghép kênh giúp loại bỏ head-of-line blocking.
Tạo mã tự động:
- Tất cả các framework gRPC cung cấp hỗ trợ để tạo mã hạng nhất. Một tệp cốt lõi để phát triển gRPC là tệp *.proto, định nghĩa hợp đồng của các service và tin nhắn gRPC. Từ tệp này, các framework gRPC sẽ mã tạo ra một lớp service cơ sở, các tin nhắn và một máy khách hoàn chỉnh.
- Bằng cách chia sẻ tệp *.proto giữa máy chủ và máy khách, tin nhắn và mã máy khách có thể được tạo từ đầu đến cuối. Tạo mã của máy khách giúp loại bỏ trùng lặp các tin nhắn trên máy khách và máy chủ và tạo ra một máy khách được gõ mạnh cho bạn. Không phải viết một client giúp tiết kiệm đáng kể thời gian phát triển trong các ứng dụng có nhiều dịch vụ.
Đặc điểm kỹ thuật nghiêm ngặt:
- Một đặc tả chính thức cho HTTP API với JSON không tồn tại. Các nhà phát triển tranh luận về định dạng tốt nhất của URL, động từ HTTP và mã phản hồi.
- Đặc tả gRPC là quy định về định dạng mà dịch vụ gRPC phải tuân theo. gRPC loại bỏ tranh luận và tiết kiệm thời gian của nhà phát triển vì gPRC nhất quán trên các nền tảng và triển khai.
Streaming:
- HTTP/2 cung cấp nền tảng cho các luồng giao tiếp thời gian thực, tồn tại lâu dài. gRPC cung cấp hỗ trợ để stream qua HTTP/2 hạng nhất.
- Dịch vụ gRPC hỗ trợ tất cả các stream kết hợp:
Unary (không stream)
Stream từ máy chủ đến máy khách
Stream từ máy khách đến máy chủ
Stream hai chiều
Deadline/timeouts and cancellation:
gRPC cho phép client chỉ định thời gian họ sẵn sàng chờ đợi RPC hoàn thành. Deadline được gửi đến máy chủ và máy chủ có thể quyết định hành động nào cần thực hiện nếu vượt quá thời hạn. Ví dụ: máy chủ có thể hủy các yêu cầu gRPC/HTTP/database đang thực hiện khi hết thời gian.
Dealine và cancellation thông qua các cuộc gọi gRPC con giúp thực thi các giới hạn sử dụng tài nguyên.

3. Ưu điểm và nhược điểm của gRPC

gRPC rất phù hợp cho các tình huống sau:
- Microservices: gRPC được thiết kế để truyền thông có độ trễ thấp và thông lượng cao. gRPC là tuyệt vời cho các microservice nhẹ và cần hiệu suất cao.
- Giao tiếp thời gian thực point-to-point - gRPC hỗ trợ tuyệt vời cho stream hai chiều. Dịch vụ gRPC có thể đẩy tin nhắn trong thời gian thực mà không cần poll.
- Môi trường polyglot - công cụ gRPC hỗ trợ tất cả các ngôn ngữ phát triển phổ biến, làm cho gRPC trở thành một lựa chọn tốt cho môi trường đa ngôn ngữ.
- Môi trường bị hạn chế về mạng - tin nhắn gRPC được tuần tự hóa với Protobuf, một định dạng tin nhắn nhẹ. Một tin nhắn gRPC luôn nhỏ hơn một tin nhắn JSON tương đương.
Hạn chế của gRPC:
Hỗ trợ trình duyệt hạn chế. Hiện nay không thể gọi trực tiếp dịch vụ gRPC từ trình duyệt. gRPC sử dụng nhiều tính năng HTTP/2 và không có trình duyệt nào cung cấp mức độ kiểm soát cần thiết đối với các request web để hỗ trợ máy khách gRPC. Ví dụ: các trình duyệt không cho phép người gọi yêu cầu sử dụng HTTP/2 hoặc cung cấp quyền truy cập vào các frames HTTP/2 bên dưới.
gRPC-Web là một công nghệ bổ sung từ nhóm gRPC để khắc phục hạn chế của gRPC trong trình duyệt. gRPC-Web bao gồm hai phần: máy khách JavaScript hỗ trợ tất cả các trình duyệt hiện đại và proxy gRPC-Web trên máy chủ. Máy khách gRPC-Web gọi proxy và proxy sẽ chuyển tiếp các request gRPC đến máy chủ gRPC.
Không phải tất cả các tính năng của gRPC đều được gRPC-Web hỗ trợ. Stream từ client và hai chiều không được hỗ trợ và có hỗ trợ cho stream từ máy chủ, nhưng còn hạn chế.
Không thể đọc được. Các yêu cầu HTTP APIs được gửi dưới dạng văn bản và có thể được đọc và tạo bởi con người. Các tin nhắn gRPC được mã hóa theo Protobuf theo mặc định. Mặc dù Protobuf có hiệu quả để gửi và nhận, định dạng nhị phân của nó không thể đọc được. Protobuf yêu cầu mô tả giao diện của tin nhắn được chỉ định trong tệp *.proto để deserialize chính xác. Công cụ bổ sung là cần thiết để phân tích tải trọng Protobuf và để tạo request thủ công.
Các tính năng như reflection của máy chủ và công cụ dòng lệnh gRPC tồn tại để hỗ trợ các tin nhắn Protobuf nhị phân. Ngoài ra, các tin nhắn Protobuf hỗ trợ chuyển đổi sang và từ JSON. Chuyển đổi JSON tích hợp cung cấp một cách hiệu quả để chuyển đổi các tin nhắn Protobuf sang và từ dạng có thể đọc được của con người khi gỡ lỗi.