Lập trình 22/09/2026 7 phút

Bốn kiểu RPC của gRPC: unary, server/client/bidirectional streaming — chạy thật cả bốn

REST chỉ có một mô hình: request rồi response. gRPC có bốn, mở khoá bằng từ khoá stream trong .proto. Bài này chạy thật cả bốn trong một service: unary (1 req→1 resp), server streaming (1 req→5 resp), client streaming (4 req→1 resp tổng đúng 500), và bidirectional (3 msg↔3 msg xen kẽ). Mỗi kiểu hợp một dạng dữ liệu khác nhau, và chọn đúng kiểu là một quyết định thiết kế API thật.

Lập trình 22/09/2026 6 phút

Server streaming thực chiến: đo thật time-to-first-item nhanh hơn 9 lần so với unary

Server streaming có làm API nhanh hơn không? Có và không. Bài này đo thật: server tạo 10 item mỗi cái 50ms. Unary bắt client chờ 529ms mới nhận được gì; server streaming đẩy item đầu sau chỉ 58ms — nhanh hơn 9 lần về time-to-first-item. Nhưng tổng thời gian gần như bằng nhau (529 vs 533ms). Streaming không rút ngắn tổng — nó thắng ở độ trễ item đầu, bộ nhớ, và xử lý song song.

Lập trình 22/09/2026 7 phút

Client streaming và bidirectional: upload theo luồng và chat hai chiều, chạy thật

Hai kiểu streaming còn lại của gRPC. Bài này chạy thật: client streaming upload 5 chunk (1024+2048+512+4096+256) rồi server gộp trả đúng 7936 byte trong một response; bidirectional gửi số và nhận bình phương ngay lập tức, xen kẽ (3→9, 5→25, 8→64, 10→100). Kèm cái bẫy deadlock kinh điển của bidi: nếu gửi và nhận cùng một goroutine, cả hai cùng chờ nhau và treo.

Lập trình 22/09/2026 6 phút

Interceptor trong gRPC: middleware bọc mọi RPC cho log, đo thời gian, auth tập trung

Cần log, đo thời gian, và xác thực cho mọi RPC — nhưng không muốn lặp code ở từng handler. Interceptor là lời giải: một lớp bọc quanh mọi call. Bài này chạy thật một chain hai interceptor: logging đo thời gian mỗi call (Fast 1µs, Slow 46ms), và auth chặn /Secure khi thiếu token (trả Unauthenticated, handler không chạy) nhưng cho qua khi token đúng. Viết một lần, áp cho toàn hệ.

Lập trình 22/09/2026 7 phút

Deadline và cancellation trong gRPC: huỷ call đúng lúc thay vì treo vô hạn

Một call không có deadline là một quả bom hẹn giờ: nếu server treo, client chờ mãi, tài nguyên cạn dần. Bài này chạy thật: server handler tốn 500ms, client đặt deadline 100ms — call bị huỷ sau đúng 101ms (không phải 500ms), client nhận DeadlineExceeded, và server phát hiện context bị huỷ nên dừng việc ngay thay vì tốn CPU cho kết quả client đã bỏ. Deadline lan truyền toàn chuỗi call qua context.

Lập trình 22/09/2026 7 phút

Error model của gRPC: status code chuẩn và details có cấu trúc thay cho chuỗi lỗi mơ hồ

Trả về error là một chuỗi text thì client phải đoán xem có nên retry không, lỗi do input hay do server. gRPC có bộ status code chuẩn giải quyết điều đó. Bài này chạy thật: server trả InvalidArgument kèm details có cấu trúc (field nào sai), NotFound, và OK; client đọc code để quyết định tự động — retry với Unavailable, bỏ với InvalidArgument. Code là ngôn ngữ chung máy hiểu, hơn hẳn một dòng text.