+6

Cơ bản về gRPC và cách Protobuf mã hóa giữ liệu trong gRPC

🔗 Tìm hiểu thêm về Pixta Vietnam: http://bit.ly/3kdkzvW

Nếu bạn đang phân vân lựa chọn những cách giao tiếp giữa client/server hoặc những service với nhau trong một hệ thống microservice, thì có thể bạn đã nghe qua về gRPC qua các bài viết khác trên Internet. Bài viết này sẽ không hướng dẫn về cách thực hiện về coding, mà tập trung vào giải thích cách protobuf mã hóa dữ liệu trong gRPC. Mong bài viết sẽ hữu ích cho bạn!

gRPC và Prorobuf là gì ?

  • gRPC (gọi tắt từ "Google Remote Procedure Call") là một framework mã nguồn mở được tạo ra bởi Google. Nó cho phép các ứng dụng chạy trên các máy tính khác nhau và trong các môi trường lập trình khác nhau có thể giao tiếp với nhau một cách hiệu quả và đáng tin cậy. gRPC sử dụng mô hình client-server để truyền tải dữ liệu giữa các ứng dụng. Nó sử dụng Protobuf (Protocol Buffers) làm định dạng dữ liệu chuẩn cho tất cả các thông điệp được truyền tải giữa các ứng dụng, vì vậy tốc độ và kích thước dữ liệu của gRPC rất nhỏ so với các phương pháp truyền tải dữ liệu truyền thống khác như JSON hay XML. gRPC hỗ trợ các ngôn ngữ lập trình khác nhau như C++, Java, Python, Go, Ruby, C#, Node.js, Android Java và iOS/Objective-C.
  • Protocol Buffers (protobuf) là một định dạng truyền tải dữ liệu được phát triển bởi Google. Nó được sử dụng để định nghĩa cấu trúc dữ liệu độc lập với ngôn ngữ và nền tảng. Protobuf là một cách hiệu quả để truyền tải dữ liệu giữa các ứng dụng, đặc biệt là khi tốc độ và dung lượng dữ liệu là yếu tố quan trọng. Protobuf sử dụng các tệp định dạng .proto để định nghĩa cấu trúc dữ liệu, sau đó sử dụng một trình biên dịch protobuf để sinh ra mã code theo các ngôn ngữ lập trình mong muốn. Các tệp định dạng .proto có thể được sử dụng để tạo ra các đối tượng dữ liệu, các tài liệu API, các tệp mã code.

Những ưu điểm của gRPC:

  • Giảm lượng dữ liệu truyền đi qua lại giữa client/server để làm giảm băng thông, tăng tốc độ nhận truyền.
  • Tiết kiệm tài nguyên: Do sử dụng Protobuf, gRPC giúp tiết kiệm tài nguyên hệ thống, giảm thiểu tình trạng tắc nghẽn mạng và tăng hiệu suất của hệ thống.
  • Hỗ trợ nhiều ngôn ngữ lập trình.
  • Đáng tin cậy và hiệu quả: gRPC sử dụng kiểu truyền tải dữ liệu RPC (Remote Procedure Call), giúp đảm bảo tính tin cậy và hiệu quả trong việc truyền tải dữ liệu.
  • Hỗ trợ nhiều dạng kết nối: Server streaming RPC, client streaming RPC, Bidirectional streaming RPC, Unary RPC.
  • gRPC được phát triển bởi Google nên việc phát triển, hỗ trợ, bảo trì được đảm bảo.

So sách nhỏ giữa REST và gRPC:

Tính năng gRPC REST
Giao thức HTTP/2 HTTP/1.1
Dữ liệu truyền Protobuf (dạng binary, được tối ưu) JSON (dạng text)
Kiểu dữ liệu Ràng buộc, yêu cầu Lỏng lẻo, tùy ý

Vì sao kích thước dữ liệu truyền được giảm khi sử dụng gRPC ?

Ví dụ khi cần truyền dữ liệu mô tả công ty theo dạng JSON. Ta có thể dễ dàng viết như thế này:

{
	"id": 23,
	"company_name": "PIXTA VIETNAM",
	"members_size": 50,
	"products": ["Pixta stock", "Pixta AI", "xFrame"]
}

Khi JSON được mã hóa về dạng có thể truyền qua Internet, nếu được xóa bỏ các khoảng trắng, đoạn JSON trên sẽ tiêu tốn 102 bytes.

Bây giờ, ta sẽ sử dụng protobuf để mã hóa cùng kiểu dữ liệu cần truyền trên. Như đã nói ở đầu bài viết, khi sử dụng gRPC, ta cần định nghĩa kiểu dữ liệu vào/ra cho cả client/server. Ở ví dụ dưới, ta định nghĩa cho thông tin cơ bản cho một công ty trong file có phần mở rộng .proto

message Company {
	required int64   id               = 1
	required string  company_name     = 2
	required int64   members_size     = 3
	repeated string  products         = 4
}

Khi chúng ta mã hóa dữ liệu công ty trên với schema đã được định.

draw.drawio (1).png

Sau khi mã hóa, dữ liệu sau khi mã hóa chỉ chiếm 50 bytes và chỉ bằng một nửa so với sử dụng định dạng JSON.

Ta có thể dễ dàng thấy, nếu sử dụng dạng JSON, dữ liệu nhị phân được truyền đi sẽ bao gồm cả tên trường dữ liệu (id, company_name, member_sizes, products). Nó sẽ tốn tương đối đáng kể băng thông khi truyền qua Internet. Trong khi đó, nếu sử dụng protobuf dữ liệu nhị phân cần truyền chỉ là một chuỗi giá trị mà cần không kèm theo tên trường. Việc giải mã sẽ được phía client dễ dàng thực hiện bằng việc sử dụng định nghĩa kiểu giá trị từ trước theo tuần tự trường thông tin (field tag) 1, 2, 3 mà không cần phải sử dụng cụ thể như với JSON.

Tuy nhiên với những ưu điểm trên, gRPC còn có những điểm yếu cần xem xét khi sử dụng.

Một số lưu ý khi sử dụng

  • gRPC sử dụng HTTP 2 thay vì HTTP 1.1 vì vậy sẽ có các hạn chế như: hỗ trợ các trình duyệt, việc deploy các services trong hệ thống cần sử dụng service registry khi có thêm service như load balancer, …
  • Việc dùng Protocol Buffers để mã hóa dữ liệu dẫn đến dữ liệu được truyền qua các service khó để đọc được một cách bình thường thay vì dùng JSON hay XML
  • Vì cơ chế gRPC cần định nghĩa dữ liệu ra/vào ở cả hai phía client và server nên quá trình phát triển cần đồng bộ các file liên quan đến gRPC và protobuf.

Vậy với những ràng buộc đôi chút phức tạp trên vì sao những hệ thống lớn đặc biệt là các hệ thống sử dụng kiến trúc microservice được ưu tiên sử dụng? Tất nhiên khi chọn những công cụ để sử dụng trong hệ thống chúng ta cần phải xem xét về đánh đổi trade off giữa các công cụ, công nghệ.

Kết luận

Việc sử dụng gRPC mục đích chính là giúp hệ thống tối ưu về băng thông cũng như tốc độ khi truyền thông tin qua lại giữa client/server. Nhưng thực tế khi sử dụng cần phải xem xét đánh đổi giữa nhiều yếu tố, ví dụ: giao thức HTTP 2 hay HTTP1.1, việc coding khi sử dụng gRPC sẽ cần khó khăn hơn khi dùng dạng truyền thống như JSON, loại dữ liệu truyền/nhận giữa client/server, …

Tham khảo:

  1. Martin Kleppmann - Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems 1st Edition[117-121].
  2. https://grpc.io/docs/what-is-grpc/core-concepts/
  3. https://developers.google.com/protocol-buffers/docs/overview
  4. https://microservices.io/patterns/service-registry.html

Tìm hiểu thêm về Pixta Vietnam tại đây

🌐 Website |🏠 Facebook | 🔖 LinkedIn |✉️ Email: recruit.vn@pixta.co.jp


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í