JSON vs Protobuf cho API di động: kích thước, tương thích và gỡ lỗi
So sánh JSON và Protobuf cho API di động: kích thước payload, tương thích ngược, gỡ lỗi và quy tắc thực tế để chọn định dạng văn bản hay nhị phân.

Tại sao định dạng API quan trọng với ứng dụng di động
Một app di động có thể cảm thấy chậm ngay cả khi backend của bạn nhanh. Nguyên nhân thường không phải thời gian xử lý server. Là mọi thứ xung quanh nó: độ trễ di động, tín hiệu yếu, thử lại, và thời gian điện thoại phải đánh thức radio mạng. Nếu một màn hình kích hoạt ba cuộc gọi API, bạn phải chịu chi phí vòng đi-về đó ba lần.
Định dạng còn ảnh hưởng tới những gì xảy ra sau khi byte đến nơi. App vẫn phải phân tích phản hồi, xác thực nó và ánh xạ vào mô hình giao diện. Công việc đó dùng CPU, nghĩa là tiêu thụ pin. Trên các máy cũ, hoặc khi app chạy nền, những kém hiệu quả nhỏ cộng dồn lại.
Kích thước payload đơn giản là bao nhiêu byte bạn gửi trên đường dây cho một yêu cầu và phản hồi, bao gồm tên trường và ký tự cấu trúc. Payload nhỏ hơn thường có nghĩa tải về nhanh hơn trên mạng yếu và ít dùng dữ liệu hơn trên các gói giới hạn. Chúng cũng có thể giảm tiêu hao pin vì radio hoạt động ít thời gian hơn và CPU ít phải phân tích hơn.
Việc chọn định dạng thay đổi cách bạn tiến hóa API một cách an toàn. Phát hành app di động chậm hơn web: người dùng cập nhật muộn, có người không bao giờ cập nhật, và kiểm duyệt cửa hàng có thể trì hoãn sửa lỗi. Nếu bạn đưa thay đổi API làm hỏng client cũ, bạn có thể phải hỗ trợ nhiều phiên bản cùng lúc dưới áp lực.
Gỡ lỗi cũng quan trọng. Với JSON, bạn thường có thể đọc payload trong log và nhanh chóng thấy lỗi. Với các định dạng nhị phân như Protobuf, bạn thường cần schema và công cụ phù hợp để giải mã những gì đã xảy ra.
Trên thực tế, quyết định này ảnh hưởng tới thời gian tải mỗi màn hình trên mạng xấu, sử dụng dữ liệu và pin, cách bạn thêm trường mà không phá vỡ app cũ, và tốc độ bạn có thể kiểm tra lỗi.
JSON và Protobuf nói ngắn gọn
JSON và Protobuf là hai cách đóng gói cùng thông tin để app và server hiểu cùng một thông điệp. Hãy nghĩ như gửi một mẩu ghi chú viết tay (JSON) hoặc một barcode gọn (Protobuf).
Với JSON, dữ liệu được gửi dưới dạng văn bản kèm tên trường mỗi lần. Một đối tượng user đơn giản có thể trông như {\"id\": 7, \"name\": \"Sam\"}. Nó đọc được ngay, giúp dễ kiểm tra trong log, dán vào báo cáo lỗi, hoặc thử nghiệm bằng công cụ cơ bản.
Với Protobuf, dữ liệu gửi dưới dạng nhị phân. Thay vì lặp tên trường như "id" và "name" trên đường dây, hai bên đồng ý trước rằng field 1 là id và field 2 là name. Thông điệp nhỏ hơn vì chủ yếu là giá trị cộng với các tag số ngắn.
Văn bản so với nhị phân, không lý thuyết
Sự đánh đổi thực tế đơn giản:
- JSON tự mô tả: thông điệp mang theo tên trường.
- Protobuf dựa trên schema: ý nghĩa đến từ file định nghĩa chung.
- JSON dễ đọc và sửa tay.
- Protobuf gọn và nhất quán, nhưng không đọc được nếu thiếu công cụ.
Schema là định nghĩa chung. Với Protobuf, các đội thường coi schema như hợp đồng được version và đồng bộ giữa backend và client. Với JSON, schema là tùy chọn; nhiều đội vẫn mô tả nó (ví dụ bằng OpenAPI), nhưng API về mặt kỹ thuật có thể chạy mà không cần schema.
Trong công việc hàng ngày, điều này thay đổi cách hợp tác. Protobuf thúc đẩy bạn theo những thay đổi API chính thức (thêm trường, giữ số field cũ, tránh đổi tên gây phá vỡ). JSON thường cho phép thay đổi lỏng lẻo hơn, nhưng sự linh hoạt đó có thể gây bất ngờ nếu client giả định trường luôn tồn tại hoặc luôn có cùng kiểu.
Trên thực tế, JSON phổ biến ở REST API công khai và tích hợp nhanh. Protobuf thường gặp ở dịch vụ gRPC, giao tiếp nội bộ giữa service và ứng dụng di động nhạy với hiệu năng, nơi băng thông và độ trễ được tối ưu.
Kích thước payload: thực tế trên đường dây thay đổi thế nào
Kích thước thô quan trọng, nhưng chi tiết còn quan trọng hơn: byte nào lặp, byte nào nén tốt, và bạn gửi chúng bao nhiêu lần.
Tại sao JSON thường lớn hơn
JSON mang nhiều văn bản dễ đọc. Chi phí lớn nhất thường là từ các từ xung quanh giá trị:
- Tên trường lặp trên mỗi đối tượng ("firstName", "createdAt", "status").
- Số được gửi dưới dạng văn bản, nên "123456" dùng nhiều byte hơn số nhị phân gọn.
- Lồng sâu thêm dấu ngoặc, dấu phẩy và dấu nháy.
- Kết quả đẹp (pretty-printed) thêm khoảng trắng không cần thiết.
Nếu API trả danh sách 200 mục và mỗi mục lặp 10 tên trường, những tên lặp đó có thể chiếm phần lớn payload.
Tại sao Protobuf thường nhỏ hơn
Protobuf thay tên trường bằng tag số và dùng mã hóa nhị phân gọn. Mã hóa packed có thể lưu trữ các số lặp hiệu quả (ví dụ nhiều ID). Và vì định dạng trên dây có kiểu, số nguyên và boolean thường mã hóa ít byte hơn phiên bản văn bản JSON.
Một mô hình tinh thần hữu ích: JSON chịu một "thuế" cho mỗi trường (tên key). Protobuf trả một khoản thuế nhỏ hơn cho mỗi trường (tag).
Nén thay đổi so sánh
Với gzip hoặc brotli, JSON thường giảm rất nhiều vì chứa chuỗi lặp và tên trường lặp nén rất tốt. Protobuf cũng nén được, nhưng có thể có ít lặp hơn nên lợi ích tương đối nhỏ hơn.
Trên thực tế, Protobuf vẫn thường thắng về kích thước, nhưng khoảng cách thường thu hẹp khi bật nén.
Khi nào “nhỏ” quan trọng nhất
Kích thước payload quan trọng nhất khi yêu cầu xảy ra thường xuyên hoặc mạng yếu. Một app di động polling mỗi 10 giây khi đang đi roaming có thể tốn dữ liệu nhanh chóng, ngay cả khi mỗi phản hồi chỉ lớn hơn một chút. Nó cũng quan trọng với màn hình trò chuyện, gợi ý tìm kiếm hay dashboard trực tiếp và với người dùng băng thông thấp.
Nếu bạn chỉ gọi endpoint vài lần mỗi phiên, tiết kiệm có thật nhưng hiếm khi đột phá. Nếu gọi hàng trăm lần, khác biệt nhỏ sẽ nhanh chóng trở nên đáng chú ý.
Tốc độ và pin: phân tích, CPU và ràng buộc thực tế
Trên di động, mạng chỉ là một nửa câu chuyện. Mỗi phản hồi phải được giải mã, chuyển thành đối tượng, và thường ghi vào cơ sở dữ liệu cục bộ. Công việc đó tiêu tốn CPU, và CPU tiêu tốn pin.
JSON là văn bản. Phân tích nó nghĩa là quét chuỗi, xử lý khoảng trắng, chuyển số và so khớp tên trường. Protobuf là nhị phân. Nó bỏ qua phần lớn chuyện đó và gần hơn tới giá trị mà app cần. Trong nhiều app, điều đó có nghĩa CPU ít hơn cho mỗi phản hồi, đặc biệt với payload lồng sâu hoặc danh sách nhiều đối tượng lặp.
“Nhanh” thực tế nghĩa là gì trên điện thoại
Bạn cảm nhận chi phí phân tích rõ nhất khi khởi động lạnh và trên thiết bị cấu hình thấp. Nếu app mở và ngay lập tức tải một feed lớn, giải mã chậm có thể thể hiện bằng màn hình trắng lâu hơn hoặc tương tác đầu tiên bị trì hoãn.
Đừng mặc định rằng Protobuf sẽ tự động khắc phục hiệu năng. Nếu phản hồi nhỏ, hoặc nút thắt là hình ảnh, handshake TLS, ghi DB hoặc render UI, lựa chọn định dạng có thể không ảnh hưởng nhiều.
Lưu lượng phía server cũng quan trọng
Mã hóa và giải mã cũng xảy ra trên server. Protobuf có thể giảm CPU mỗi yêu cầu và cải thiện throughput, hữu ích khi nhiều client polling hoặc sync thường xuyên. Nhưng nếu thời gian backend bị chi phối bởi truy vấn DB, cache hoặc logic nghiệp vụ, sự khác biệt có thể nhỏ.
Để đo công bằng, giữ các bài test kiểm soát: dùng cùng mô hình dữ liệu và số bản ghi, khớp cài đặt nén (hoặc tắt nén cho cả hai), test trên mạng di động thực tế (không chỉ Wi‑Fi nhanh), và đo thời gian end-to-end cộng thời gian decode CPU (không chỉ thời gian tải). Bao gồm ít nhất một thiết bị cấu hình thấp.
Một quy tắc đơn giản: định dạng nhị phân đáng giá khi bạn gửi nhiều dữ liệu có cấu trúc thường xuyên, và bạn có thể chứng minh thời gian phân tích là phần đáng kể của độ trễ hoặc tiêu thụ pin.
Tương thích ngược: tiến hóa API an toàn thế nào
Tương thích ngược nghĩa là phiên bản app cũ vẫn hoạt động sau khi bạn deploy server mới. Trên di động, điều này quan trọng hơn web vì người dùng không cập nhật ngay. Bạn có thể có ba bốn phiên bản app đang hoạt động cùng lúc.
Quy tắc thực tế là làm thay đổi phía server theo hướng bổ sung. Server nên chấp nhận request cũ và trả về phản hồi mà client cũ có thể hiểu.
Với JSON, thay đổi bổ sung thường là thêm trường mới tùy chọn. Client cũ sẽ bỏ qua trường không dùng, nên thường an toàn. Bẫy phổ biến không phải do JSON mà do giả định: đổi kiểu trường (string sang number), đổi tên trường, thay đổi ý nghĩa mà không đổi tên, hoặc biến giá trị ổn định thành mở.
Với Protobuf, tương thích nghiêm ngặt hơn và đáng tin cậy hơn nếu bạn theo đúng quy tắc. Số field là hợp đồng, không phải tên. Nếu bạn xoá một trường, đừng tái sử dụng số của nó. Reserve nó để không bị dùng lại sau này. Tránh đổi kiểu field hoặc chuyển lặp/non-lặp vì client cũ có thể hỏng.
Thay đổi an toàn ở cả hai định dạng thường trông như:
- Thêm trường tùy chọn mới với mặc định hợp lý.
- Thêm giá trị enum, và để client xử lý giá trị chưa biết.
- Giữ trường hiện có ổn định về kiểu và ý nghĩa.
- Deprecate trường trước, rồi mới xoá khi số lượng client cũ giảm.
Có hai kiểu versioning hay gặp. Tiến hóa bổ sung giữ một endpoint và mở rộng schema theo thời gian, thường phù hợp với di động. Endpoint versioned (v1, v2) hữu ích khi bạn cần thay đổi phá vỡ, nhưng cũng tăng gấp đôi công việc test và hỗ trợ.
Ví dụ: app của bạn hiển thị danh sách đơn hàng. Nếu muốn thêm delivery ETA, hãy thêm delivery_eta là tùy chọn. Đừng tái dùng status để chứa timestamp. Nếu cần mô hình mới, cân nhắc v2 trong khi vẫn phục vụ v1 cho đến khi lượng người dùng cũ giảm.
Gỡ lỗi và quan sát: thấy vấn đề ở đâu
Khi có sự cố trên kết nối di động, bạn thường có ba manh mối: lỗi client, dòng log server và trace của request. Định dạng ảnh hưởng tốc độ những manh mối đó biến thành câu trả lời.
JSON dễ inspect vì đọc được. Bạn có thể copy body JSON từ log, capture proxy, hoặc ticket hỗ trợ và hiểu ngay. Điều này hữu ích khi gỡ lỗi trong release hoặc khi đồng nghiệp không phải backend cần xác nhận app đã gửi gì.
Protobuf có thể gỡ lỗi bằng cách lập kế hoạch. Payload là nhị phân, nên bạn cần schema và bước giải mã để thấy trường. Nhiều đội xử lý bằng cách log tóm tắt an toàn các trường chính (không log raw bytes) kèm metadata request.
Làm Protobuf dễ gỡ lỗi thực tế
Một vài thói quen giúp nhiều:
- Log tóm tắt đã giải mã (ví dụ: user_id, request_type, item_count), không phải toàn bộ message.
- Lưu .proto theo version và cho người xử lý sự cố truy cập.
- Bao gồm request ID và trace ID trong mọi phản hồi và dòng log.
- Dùng tên enum rõ ràng và tránh tái dùng field cho nhiều ý nghĩa.
- Validate nghiệp vụ sớm và trả mã lỗi dễ đọc.
Quan sát còn là theo dõi mà không lộ dữ liệu nhạy cảm. Với cả hai định dạng, quyết định sớm những gì an toàn để log, cái phải redact, và cái không bao giờ rời thiết bị. PII như email, số điện thoại, vị trí chính xác và dữ liệu thanh toán nên được lọc trước khi lưu log.
Một kịch bản đơn giản: support báo user không nộp được form trên mạng yếu. Với JSON, bạn có thể thấy ngay trường "country" thiếu trong request capture. Với Protobuf, bạn có cùng kết luận nếu log ghi snapshot đã giải mã như "country: unset" và version schema.
Cách chọn: quy trình ra quyết định từng bước
Chọn giữa JSON và Protobuf hiếm khi là quyết định một lần cho toàn công ty. Hầu hết đội làm tốt hơn khi quyết theo khu vực tính năng, dựa trên sử dụng thực tế.
Quy trình 5 bước đơn giản
Bắt đầu bằng cách nhóm endpoint sao cho bạn có thể đo được. Xác định gọi nào xảy ra trên mỗi màn hình và gọi nào hiếm hoặc chạy nền. Đo những gì bạn gửi hôm nay (kích thước trung bình và p95, cộng tần suất gọi trên mỗi người dùng hoạt động). Rồi cân nhắc thực tế client: điện thoại cấu hình thấp, mạng chập chờn, hành vi offline và tốc độ người dùng cập nhật.
Từ đó, chọn theo từng nhóm: giữ JSON nơi khả năng đọc và gỡ lỗi nhanh quan trọng, và dùng Protobuf nơi kích thước và tốc độ phân tích đã được chứng minh là điểm nghẽn. Cuối cùng, chạy pilot nhỏ: đổi một khu vực có lưu lượng cao, phát hành cho nhóm người dùng giới hạn, và so sánh kết quả trước khi tiêu chuẩn hóa.
Sau khi đo, mẫu thường rõ: vài endpoint chiếm phần lớn dùng dữ liệu và thời gian chờ. Đó là ứng cử viên tốt nhất cho định dạng nhị phân.
Những gì cần xem trong pilot
Định nghĩa thành công trước khi xây. Các chỉ số hữu ích gồm thời gian median và p95, byte truyền mỗi phiên, phiên không crash, và thời gian CPU dành cho phân tích phản hồi (đặc biệt trên thiết bị cũ).
Nếu bạn có endpoint feed gọi 30 lần/ngày trả danh sách lớn với trường lặp, Protobuf có thể có lợi. Nếu vấn đề lớn nhất là “không biết lỗi do đâu” khi support, giữ JSON cho khu vực đó có thể tiết kiệm thời gian nhiều hơn chi phí.
Sai lầm phổ biến các đội hay mắc
Các đội thường tranh luận về định dạng trước khi có số liệu. Điều đó dẫn tới chuyển đổi thêm công việc nhưng ít thay đổi về độ trễ, pin hoặc chi phí dữ liệu.
Mô hình phổ biến là đổi JSON sang Protobuf vì “nhị phân nhỏ hơn”, rồi nhận ra vấn đề thật sự là ảnh quá lớn, endpoint quá nhiều cuộc gọi, hoặc cache kém. Hãy đo trên thiết bị thật và mạng thật, không chỉ Wi‑Fi văn phòng nhanh.
Các lỗi thường gặp: đổi định dạng mà không có baseline, phá client khi sửa schema “nhỏ” (đổi tên, kiểu, tái dùng ID field Protobuf), dùng nhị phân mọi nơi dù không cần, và bỏ qua trải nghiệm dev khi gỡ lỗi production. Một vấn đề hay gặp nữa là cấu hình nén và cache sai, rồi đổ lỗi cho serialization.
Ví dụ: một đội chuyển feed sang Protobuf và ăn mừng payload nhỏ hơn 30% ở staging. Ở production app vẫn chậm vì feed thực hiện 5 request riêng biệt, không cache, và server liên tục thêm trường “phòng khi cần”. Định dạng không phải vấn đề chính.
Kịch bản ví dụ: app di động với cập nhật thường xuyên
Hãy tưởng tượng app có tính năng trò chuyện: người dùng thấy danh sách hội thoại, chỉ báo đang gõ, nhận biết giao hàng, và cập nhật profile thỉnh thoảng. Tin nhắn đến như các cập nhật nhỏ, thường xuyên, và nhiều người dùng ở mạng chập chờn.
Phản hồi JSON “lấy cập nhật mới nhất” bắt đầu nhỏ rồi tăng dần. Ban đầu có thể chỉ trả text, sender và timestamp. Vài release sau thêm reactions, read states theo thiết bị, flag kiểm duyệt và đối tượng người dùng phong phú hơn. JSON giúp phát hành dễ, nhưng payload có thể phình vì tên trường lặp trên mỗi item và đội cứ thêm các block tùy chọn “phòng khi”.
{
"messages": [
{
"id": "m_1842",
"text": "On my way",
"sentAt": "2026-01-29T10:12:03Z",
"sender": {"id": "u_7", "name": "Maya"},
"reactions": [{"emoji": "👍", "count": 3}],
"readBy": ["u_2", "u_5"]
}
],
"typing": ["u_7"]
}
Với Protobuf, cùng dữ liệu thường nhỏ hơn trên dây vì các trường mã hóa bằng tag số và kiểu gọn, không phải chuỗi lặp. Điều này hữu ích khi cập nhật thường xuyên và người dùng giới hạn dữ liệu. Đổi lại là cần phối hợp: schema, sinh mã và quy tắc chặt chẽ khi thay đổi. Gỡ lỗi chuyển từ “đọc log” sang “giải mã với đúng schema”.
Kết quả thường là cách tiếp cận phân chia. Nhiều đội giữ các endpoint dễ inspect ở JSON vì payload vừa phải: login, settings, feature flags, và màn hình admin. Protobuf thường phù hợp với lưu lượng cao như đồng bộ tin nhắn, cập nhật tăng dần, presence, danh sách hội thoại lớn với đối tượng lặp, và batch analytics.
Để rollout an toàn với phiên bản app cũ, đừng chuyển mọi thứ cùng lúc. Chạy song song hai định dạng (ví dụ qua header yêu cầu Protobuf), giữ mặc định hợp lý, và tuân thủ quy tắc tương thích. Với Protobuf, không tái dùng số field. Với JSON, giữ trường mới là tùy chọn và tránh thay đổi kiểu im lặng.
Danh sách kiểm tra nhanh và bước tiếp theo
Hãy quyết định dựa trên lưu lượng và thực tế phát hành, không phải khẩu vị. Chọn định dạng chỉ đáng giá khi giảm được đau nhức người dùng (màn hình chậm, timeout, tiêu hao pin) hoặc đau nhức đội (thay đổi phá vỡ, khó gỡ lỗi).
Một số kiểm tra nhanh:
- Có phản hồi nào thường lớn hơn vài trăm KB, hoặc được gọi hàng chục lần mỗi phiên (feeds, chat, tracking, sync)?
- Các phiên bản app cũ còn hoạt động nhiều tháng không?
- Bạn có thể thực thi kỷ luật schema mỗi khi API thay đổi không?
- Support và QA có cần copy/paste và inspect payload để tái tạo lỗi không?
Quy tắc: nếu payload nhỏ và người ta thường đọc chúng, JSON thường thắng sớm. Nếu bạn có payload nặng, tần suất cao (hoặc mạng không tin cậy) và bạn có thể giữ schema chặt chẽ, Protobuf đáng để đầu tư.
Kế hoạch bước tiếp trung thực:
- Chọn một endpoint bận (home feed hoặc sync).
- Triển khai nó bằng JSON và Protobuf với cùng trường và hành vi.
- Đo kích thước trên dây, thời gian phân tích trên điện thoại tầm trung, tỉ lệ lỗi và thời gian để gỡ lỗi.
- Ghi chính sách tương thích cho cách thêm và deprecate trường, và cách client xử lý trường chưa biết.
Nếu bạn muốn prototype nhanh, AppMaster (appmaster.io) có thể sinh backend và app từ mô hình dữ liệu đã định nghĩa, giúp bạn chạy pilot song song và lặp schema mà không phải viết nhiều mã thủ công.
Câu hỏi thường gặp
Mặc định dùng JSON nếu bạn ưu tiên tốc độ phát triển và gỡ lỗi dễ dàng. Chuyển sang Protobuf khi bạn có các endpoint tần suất cao hoặc phản hồi có cấu trúc lớn, nơi số byte và thời gian phân tích rõ ràng ảnh hưởng đến thời gian tải màn hình, sử dụng dữ liệu hoặc pin.
Các chuyến đi vòng (round trip) thường là chi phí thực sự trên di động. Nếu một màn hình kích hoạt nhiều cuộc gọi, độ trễ mạng di động và việc thử lại có thể chiếm ưu thế, ngay cả khi server nhanh. Giảm số yêu cầu và số byte trên mỗi yêu cầu thường quan trọng hơn việc rút vài mili-giây khỏi thời gian xử lý backend.
Kích thước payload là tổng số byte gửi cho một yêu cầu và phản hồi, bao gồm tên trường và ký tự cấu trúc. Payload nhỏ hơn thường tải nhanh hơn trên mạng yếu, dùng ít dữ liệu hơn và có thể giảm tiêu hao pin vì radio hoạt động ít thời gian hơn và điện thoại ít phải phân tích hơn.
JSON lặp tên trường và mã hóa số dưới dạng văn bản, nên thường gửi nhiều byte hơn. Protobuf dùng tag số và kiểu nhị phân, nên thường nhỏ hơn, đặc biệt với danh sách có nhiều trường lặp. Kích thước chênh lệch thường giảm khi bật nén, nhưng Protobuf vẫn thường thắng.
Không hẳn luôn vậy. Nếu phản hồi nhỏ hoặc điểm nghẽn là hình ảnh, handshake TLS, ghi cơ sở dữ liệu hay render UI, thay đổi định dạng có thể ít tác động. Protobuf có lợi khi bạn gửi nhiều dữ liệu có cấu trúc thường xuyên và thời gian giải mã là phần đáng kể của độ trễ end-to-end.
Phân tích JSON tốn CPU vì điện thoại phải quét văn bản, so khớp tên trường và chuyển đổi giá trị như số và ngày. Giải mã Protobuf thường trực tiếp và nhất quán hơn, nên có thể giảm công việc CPU. Lợi ích rõ nhất trên thiết bị cấu hình thấp, khởi động lạnh và payload lồng nhau lớn.
Thay đổi bổ sung là an toàn nhất cho cả hai định dạng: thêm trường mới tùy chọn với giá trị mặc định hợp lý và giữ nguyên kiểu cũng như ý nghĩa của các trường hiện có. Với JSON, các thay đổi phá vỡ thường do đổi tên hoặc thay đổi kiểu. Với Protobuf, đừng tái sử dụng số field đã loại bỏ và tránh thay đổi kiểu để giữ cho client cũ hoạt động.
JSON dễ đọc trực tiếp trong log và capture, giúp khắc phục sự cố nhanh. Protobuf cũng có thể gỡ lỗi được, nhưng bạn cần schema và công cụ giải mã; tốt nhất là log tóm tắt đã giải mã các trường chính thay vì lưu raw bytes. Lập kế hoạch cho việc này trước khi sự cố xảy ra.
Chọn một endpoint tầm cao và triển khai cả hai định dạng với cùng dữ liệu và cài đặt nén. Đo p50/p95 latency, byte truyền mỗi phiên, thời gian decode trên ít nhất một điện thoại cấu hình thấp, và tỉ lệ lỗi trên mạng di động thực tế. Quyết định dựa trên số liệu đó, không phải giả định.
Giữ JSON cho các endpoint mà con người thường xuyên kiểm tra payload hoặc lưu lượng thấp, như auth, settings, và feature flags. Dùng Protobuf cho nơi lưu lượng nặng và lặp lại, như feed, sync chat, presence, hoặc batch analytics. Nhiều nhóm thành công với cách kết hợp thay vì chuyển toàn bộ.


