Mở đầu
Trong một ngày rảnh rỗi, tôi ngồi đọc lại về gRPC để có thể nắm vững hơn về nó. gRPC là một nền tảng RPC của Google. Tên gọi này khi được viết đầy đủ sẽ khiến máy tính bị tràn bộ nhớ: “gRPC Remote Procedure Call”. Đây là một cách đặt tên đệ quy mà mấy anh em PHP (PHP Hypertext Processor) thường quen thuộc.
Tại sao chúng ta cần gRPC?
RPC có thể được xem như là một giao thức request-response thông thường, tuy nhiên nó được sử dụng để giao tiếp giữa các server (server-server) nhiều hơn là giao tiếp giữa client và server. Điều này là vô cùng quan trọng trong các hệ thống phân tán, khi mà mã nguồn ứng dụng được chia ra trên nhiều server thay vì chỉ trên một server duy nhất. Một ví dụ điển hình cho kiến trúc này là kiến trúc Microservices.
Điều này đồng nghĩa rằng một yêu cầu từ phía client có thể đòi hỏi sự tham gia từ nhiều dịch vụ chạy trên các server khác nhau để có được thông tin cần thiết trước khi gửi trả về cho client. Vấn đề giao tiếp giữa các server lúc này trở thành một vấn đề lớn, bởi vì trước đây, khi tất cả các dịch vụ chạy trên cùng một server, việc gọi dịch vụ từ server này sang server khác chỉ đơn giản là một cuộc gọi nội bộ, không gây ra bất kỳ vấn đề gì. Tuy nhiên, trong trường hợp này, khi một server muốn “nói chuyện” với một server khác, nó sẽ cần mã hóa dữ liệu (JSON, XML), và server nhận dữ liệu cũng cần giải mã để hiểu được ý nghĩa của thông điệp và sau đó mã hóa dữ liệu trước khi gửi trả lời. Việc này tốn rất nhiều tài nguyên xử lý (CPU), trong khi thực tế chỉ cần thực hiện mã hóa và giải mã tại hai điểm cuối (điểm nhận và điểm trả về).
Sự ra đời của gRPC
gRPC ra đời nhằm tối ưu quá trình “giao tiếp” giữa các server. Để giải quyết vấn đề đã đề cập ở trên, gRPC sử dụng mã nhị phân để truyền dữ liệu thay vì mã hóa chúng thành các ngôn ngữ trung gian như JSON/XML. Điều này rõ ràng giúp tăng tốc độ giao tiếp giữa các server đáng kể, đồng thời giảm thiểu công việc xử lý cho CPU. Google cũng đã phát triển protobuffs (protocol buffers), đây là khung ngôn ngữ mà gRPC sử dụng như một định dạng tuần tự mặc định. Việc triển khai phần này đòi hỏi sự am hiểu sâu sắc, vì vậy Google đã tạo ra protobuffs như một công cụ giúp tạo ra mã cốt lõi cho các ngôn ngữ phổ biến như C++, C#, Go, Java và Python.
Http/2 và gRPC
gRPC sử dụng giao thức http/2 để truyền dữ liệu nhị phân. Http/2 là một phiên bản được cải tiến so với http/1.1. Http/2 có thể coi là sự thay thế cho giao thức SPDY, một giao thức cũng được Google phát triển và đã ngừng hỗ trợ từ năm 2015 (http/2 đã được triển khai và thay thế SPDY).
Kết luận
Đó là một vài dòng ghi chú về những điểm quan trọng của gRPC. Đối với những ai muốn tìm hiểu về gRPC để xây dựng các hệ thống phân tán với hiệu suất cao hơn, không nên phớt lờ đi gRPC.