Protocol Buffers: Định Dạng Tuần Tự Hóa Của Google
Protocol Buffers là định dạng tuần tự hóa nhị phân của Google dựa trên schema: file .proto được biên dịch thành mã có kiểu dữ liệu rõ ràng qua trình biên dịch protoc. Nó phát huy giá trị khi nhiều hơn một service, viết bằng nhiều hơn một ngôn ngữ, cần thống nhất hình dạng message mà không phải tự viết parser cho từng bên. Bỏ qua nếu bạn chỉ cần một script nhỏ hoặc một file cấu hình mà con người sửa trực tiếp.
Protocol Buffers Là Gì?
Protocol Buffers, còn gọi là protobuf, là cách Google tuần tự hóa dữ liệu có cấu trúc mà không phụ thuộc vào một ngôn ngữ lập trình hay nền tảng cụ thể, được thiết kế để vẫn hoạt động khi định nghĩa message thay đổi. Bạn mô tả một message một lần trong file schema .proto, chạy qua trình biên dịch protoc, rồi nhận lại mã nguồn được sinh ra, xử lý việc mã hóa và giải mã. Tài liệu đầy đủ nằm tại protobuf.dev.
Tính Năng Chính Cho Trao Đổi Dữ Liệu
- ✓Một file schema .proto duy nhất được protoc biên dịch thành mã nguồn cho bất kỳ ngôn ngữ nào bạn nhắm tới, nên schema luôn là nguồn thông tin duy nhất cho hình dạng message.
- ✓Runtime chính thức cho C++, Java, Python, Objective-C, C#, Ruby và PHP nằm ngay trong các thư mục source của repo này, mỗi thư mục có hướng dẫn cài đặt riêng.
- ✓Runtime cho Go, Dart và JavaScript được duy trì riêng tại protocolbuffers/protobuf-go, dart-lang/protobuf và protocolbuffers/protobuf-javascript.
- ✓protoc được phát hành dưới dạng binary dựng sẵn theo từng release (protoc-$VERSION-$PLATFORM.zip trên trang GitHub Releases), kèm theo bộ file .proto chuẩn.
- ✓Build bằng Bazel được hỗ trợ đầy đủ qua Bzlmod trên Bazel 8 trở lên, khai báo bằng bazel_dep trong MODULE.bazel, cùng đường build WORKSPACE kiểu cũ dùng http_archive và protobuf_deps().
- ✓Chính sách hỗ trợ phiên bản được ghi rõ tại protobuf.dev/version-support/, nêu mỗi thư viện ngôn ngữ được hỗ trợ trong bao lâu.
Trường Hợp Sử Dụng Phổ Biến Của Protobuf
- •Định nghĩa hợp đồng định dạng dữ liệu truyền tải giữa các service viết bằng nhiều ngôn ngữ khác nhau, dùng một file .proto làm nguồn thông tin chung cho hình dạng message.
- •Làm việc trong một hệ thống build dùng Bazel, vì Bazel 8 trở lên được hỗ trợ Bzlmod đầy đủ chỉ qua một khai báo bazel_dep đơn giản.
- •Kéo một binary protoc đã đóng phiên bản vào CI thay vì tự build trình biên dịch, dùng các gói protoc-$VERSION-$PLATFORM.zip theo từng release.
- •Theo dõi thời hạn hỗ trợ đã công bố cho runtime của một ngôn ngữ qua protobuf.dev/version-support/, thay vì đoán xem một release còn được duy trì bao lâu.
Cài Đặt Trình Biên Dịch Và Runtime Của Protobuf
Hầu hết người dùng nên bắt đầu từ một release chính thức thay vì nhánh main, vì build trên HEAD có thể gãy do các thay đổi không tương thích mã nguồn hoặc chưa được kiểm thử đầy đủ; ngay cả các release branch cũng có thể không ổn định giữa các commit release, nên hãy ghim vào một commit release cụ thể nếu bạn build từ source. Với riêng trình biên dịch: người dùng C++ làm theo hướng dẫn cài đặt C++ trong src/README.md, còn lại có thể tải một binary protoc dựng sẵn từ trang GitHub Releases, đóng gói theo từng release dưới dạng protoc-$VERSION-$PLATFORM.zip kèm bộ file .proto chuẩn. Các phiên bản cũ không còn trên trang release có thể tìm trên Maven repository. Binary dựng sẵn chỉ có cho các phiên bản đã release, nên nếu bạn cần HEAD của nhánh main hoặc đang sửa chính mã nguồn protobuf, hãy build protoc từ source theo src/README.md thay vì tải sẵn. Cài đặt runtime thì theo từng ngôn ngữ: C++, Java, Python, Objective-C, C#, Ruby và PHP mỗi ngôn ngữ có hướng dẫn riêng trong thư mục source của nó trong repo này, còn runtime của Go, Dart và JavaScript được cài từ các repo riêng của chúng. Người dùng Bazel có thể kéo protobuf vào qua Bzlmod với khai báo bazel_dep trong MODULE.bazel, hoặc dùng file WORKSPACE kiểu cũ với http_archive và lệnh protobuf_deps().
Bắt Đầu Với Protobuf
README không hướng dẫn cụ thể từng bước với một file .proto hay một lệnh protoc thực tế ngay trong file. Nó trỏ bạn tới các tutorial trong developer guide tại protobuf.dev/getting-started như điểm bắt đầu, cùng một bộ ví dụ mã trong thư mục examples của repo. Từ đó, tài liệu đầy đủ nằm tại protobuf.dev, chính sách hỗ trợ phiên bản ở protobuf.dev/version-support/, và có một Google Group bạn có thể tham gia để theo dõi các thay đổi sắp tới và kết nối với những nhà phát triển và người dùng protobuf khác.
Điểm Mạnh
- ✓Runtime chính thức cho C++, Java, Python, Objective-C, C#, Ruby và PHP nằm ngay trong repo này, mỗi ngôn ngữ có hướng dẫn cài đặt riêng trong thư mục source của nó.
- ✓protoc được phân phối dưới dạng binary dùng ngay theo từng release, nên phần lớn người dùng không viết C++ không cần tự build trình biên dịch.
- ✓Hỗ trợ Bazel đầy đủ qua Bzlmod trên Bazel 8 trở lên, cộng thêm đường WORKSPACE kiểu cũ, phù hợp cho các team đã dùng Bazel để build.
- ✓Chính sách hỗ trợ phiên bản được công bố tại protobuf.dev/version-support/ cho biết trước mỗi thư viện ngôn ngữ được hỗ trợ trong bao lâu.
- ✓Được Google đứng sau phát triển, với một Google Group hoạt động để theo dõi các thay đổi sắp tới và kết nối với các nhà phát triển protobuf khác.
Cân Nhắc Và Giới Hạn
- △Các dữ kiện có ở đây không nêu rõ giấy phép của protobuf, nên hãy xác nhận điều khoản trước khi đưa vào một codebase thương mại.
- △Build từ HEAD của nhánh main có thể gãy do các thay đổi không tương thích mã nguồn hoặc chưa được kiểm thử đầy đủ, theo README, và ngay cả release branch cũng có thể không ổn định giữa các commit release.
- △Runtime của Go, Dart và JavaScript nằm ở các repo riêng (protobuf-go, dart-lang/protobuf, protobuf-javascript) thay vì trong repo này, nên một dự án đa ngôn ngữ phải theo dõi nhiều hơn một chu kỳ release.
- △Binary protoc dựng sẵn chỉ có cho các phiên bản đã release; dùng HEAD của nhánh main hoặc sửa chính mã nguồn protobuf nghĩa là bạn phải tự build trình biên dịch từ source.
- △README không kèm ví dụ .proto hay lệnh protoc cụ thể ngay trong file, nên hướng dẫn viết schema đầu tiên nằm ngoài repo này, tại protobuf.dev/getting-started.
- △Cách cấu hình Bazel đã thay đổi qua từng release: README ghi rằng bản 30.x thêm vài load statement cho rules_java và rules_python, nên một build script đã ghim phiên bản có thể cần cập nhật khi bạn đổi version.
Lựa Chọn Thay Thế Cho Protocol Buffers
Câu Hỏi Thường Gặp
Repo này ghi nhận runtime chính thức cho C++, Java, Python, Objective-C, C#, Ruby và PHP, mỗi ngôn ngữ cài từ thư mục source riêng. Runtime của Go, Dart và JavaScript được duy trì ở các repo riêng: protocolbuffers/protobuf-go, dart-lang/protobuf và protocolbuffers/protobuf-javascript.
Tải một binary protoc dựng sẵn cho nền tảng của bạn từ trang GitHub Releases, đóng gói theo từng release dưới dạng protoc-$VERSION-$PLATFORM.zip. Người dùng C++, hoặc bất kỳ ai cần HEAD của nhánh main hay đang sửa chính mã nguồn protobuf, nên build protoc từ source theo hướng dẫn trong src/README.md.
Tài liệu đầy đủ của Protocol Buffers nằm tại protobuf.dev, gồm cả tutorial bắt đầu tại protobuf.dev/getting-started và các ví dụ mã trong thư mục examples của repo này.
Protocol Buffers công bố chính sách hỗ trợ phiên bản tại protobuf.dev/version-support/, nêu rõ mỗi thư viện ngôn ngữ được hỗ trợ trong bao lâu.
Làm theo hướng dẫn cài đặt C++ trong src/README.md. README khuyên đi theo hướng này nếu bạn cần HEAD của nhánh main hoặc đang sửa chính mã nguồn protobuf, vì binary dựng sẵn chỉ có cho các phiên bản đã release.
Vấn Đề Protocol Buffers Giải Quyết
Hai service viết bằng hai ngôn ngữ khác nhau mà cần trao đổi dữ liệu có cấu trúc thường phải tự viết parser ở mỗi bên, hoặc chuyển sang dùng JSON và hy vọng cả hai bên thống nhất về tên trường và kiểu dữ liệu khi schema thay đổi theo thời gian. Protocol Buffers biến sự thống nhất đó thành một tài sản cụ thể: bạn viết hình dạng message một lần trong file .proto, chạy protoc, và mỗi ngôn ngữ nhận được mã được sinh ra tự động từ đúng định nghĩa đó thay vì một bản viết tay riêng lẻ.
Ai Nên Dùng — Và Ai Nên Bỏ Qua
Chọn Protocol Buffers khi có nhiều hơn một service, thường viết bằng nhiều hơn một ngôn ngữ, cần thống nhất về một hình dạng message chặt chẽ, có phiên bản, và bạn không ngại thêm protoc vào build của mình. Bỏ qua nếu chỉ có một script nhỏ. Cũng nên bỏ qua nếu bạn cần một định dạng mà người không phải kỹ sư có thể mở bằng trình soạn thảo văn bản và đọc trực tiếp, vì quy trình .proto-và-protoc thêm một bước build mà một payload JSON thuần không cần tới.
Repo liên quan
Muốn nghe thêm một ý kiến về protobuf?
Hỏi một AI đọc được trang này — một cú bấm là có ngay nhận định về protobuf.
