0

TỪ KHÓA rpc TRONG PROTOBUF: BẢN CHẤT CỦA "HỢP ĐỒNG GIAO TIẾP"

trong các hệ thống Microservices hiện đại, khi giao tiếp giữa các dịch vụ đòi hỏi tốc độ cực cao, độ trễ thấp và sự ràng buộc kiểu dữ liệu chặt chẽ, cặp bài trùng gRPC và Protocol Buffers (Protobuf) trở thành tiêu chuẩn vàng.

Và khi nhìn vào một file định nghĩa .proto, từ khóa rpc chính là linh hồn định hình nên "hợp đồng giao tiếp" giữa các dịch vụ.

Hãy cùng mổ xẻ bản chất sâu xa của từ khóa rpc trong Protobuf và cách nó vận hành dưới tầng sâu.

1. Bản Chất Của Từ Khóa rpc Là Gì?

Trong Protocol Buffers, từ khóa rpc (viết tắt của Remote Procedure Call) không dùng để viết logic code thực thi, mà đóng vai trò là một Interface Definition Language (IDL) - Ngôn ngữ định nghĩa giao diện.

Khi bạn khai báo một dòng rpc, bạn đang nói với trình biên dịch Protobuf rằng: "Tôi muốn định nghĩa một thủ tục (hàm) có thể được gọi từ xa qua mạng, nhận vào một thông điệp (message) chuẩn hóa và trả về một kết quả được định nghĩa rõ ràng về kiểu dữ liệu."

Nó giống như việc bạn và đối tác ký một hợp đồng thương mại: quy định rõ ràng mặt hàng nào được gửi đi (Request) và mặt hàng nào sẽ nhận về (Response), hoàn toàn không quan tâm bên trong kho người ta sản xuất bằng cách nào.

2. Cú Pháp Chuẩn Của Một Khai Báo rpc

Một cấu trúc rpc trong file .proto luôn đi kèm với khối service, cấu trúc tường minh như sau:

Protocol Buffers

syntax = "proto3";

package user;

// Định nghĩa Service tổng thể
service UserService {
    // Khai báo một RPC method
    rpc GetUserProfile (UserRequest) returns (UserResponse);
}

// Khối cấu trúc dữ liệu Request
message UserRequest {
    int64 user_id = 1;
}

// Khối cấu trúc dữ liệu Response
message UserResponse {
    int64 user_id = 1;
    string username = 2;
    string email = 3;
}

3. Sức Mạnh Thực Sự: 4 Mô Hình Giao Tiếp Đằng Sau Từ Khóa rpc

Điểm ăn tiền nhất khiến từ khóa rpc mạnh mẽ hơn rất nhiều so với HTTP/RESTful API truyền thống (vốn chỉ có kiểu Request-Response một chiều) là việc nó hỗ trợ 4 mô hình gọi hàm mạng khác nhau:

  1. Unary RPC (Truyền thống):

    Client gửi 1 request →\rightarrow Server xử lý và trả về 1 response duy nhất. (Giống hệt HTTP REST call).

    • Cú pháp: rpc GetData (Request) returns (Response);
  2. Server Streaming RPC:

    Client gửi 1 request →\rightarrow Server trả về một chuỗi dòng dữ liệu liên tục (stream of responses). Cực kỳ tối ưu cho các bài toán thời gian thực như bảng giá chứng khoán, live tracking, hoặc tải file lớn.

    • Cú pháp: rpc GetStockPrices (StockRequest) returns (stream StockResponse);
  3. Client Streaming RPC:

    Client liên tục gửi một chuỗi stream dữ liệu lên server →\rightarrow Server nhận hết, xử lý xong rồi trả về 1 response duy nhất tổng kết. (Phù hợp cho việc upload file lớn hoặc gom dữ liệu cảm biến).

    • Cú pháp: rpc UploadData (stream ChunkRequest) returns (UploadResponse);
  4. Bidirectional Streaming RPC (Song công toàn phần):

    Cả Client và Server đều mở luồng stream độc lập và có thể gửi/nhận dữ liệu qua lại lẫn nhau cùng một thời điểm hoàn toàn bất đồng bộ. (Thường dùng cho ứng dụng Chat thời gian thực hoặc game multiplayer).

    • Cú pháp: rpc ChatSession (stream ChatMessage) returns (stream ChatMessage);

4. Từ Khóa rpc Biến Thành Code Như Thế Nào?

Khi bạn viết từ khóa rpc trong file .proto và chạy công cụ biên dịch (protoc):

  • Trình biên dịch sẽ đọc từ khóa rpc đó và tự động sinh ra (generate) các tệp mã nguồn (ví dụ bằng Go, Python hoặc PHP).

  • Ở phía Client: Nó tạo ra một Stub (Proxy), giúp bạn gọi một hàm từ xa như thể đang gọi một hàm cục bộ bình thường trong code: client.GetUserProfile(ctx, &req).

  • Ở phía Server: Nó tạo ra một Interface chứa sẵn khung hàm (Server Interface). Nhiệm vụ duy nhất của lập trình viên Backend là viết code ghi đè (override) logic thực tế vào cái khung hàm đó là xong.

💡 Lời Kết

Từ khóa rpc trong Protobuf chính là cầu nối thu hẹp khoảng cách giữa không gian mạng phân tán. Thay vì phải đau đầu viết các đoạn code cURL thủ công, cấu hình JSON header lằng nhằng, từ khóa rpc ép buộc cả hệ thống tuân thủ một tiêu chuẩn giao tiếp cực kỳ chặt chẽ, an toàn và tối ưu hóa hiệu năng tối đa!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí