0

Bài 3: 4 loại Streaming trong gRPC

1. Streaming trong gRPC là gì?

Nếu như REST API chỉ hoạt động theo mô hình Request - Response cổ điển (Client gửi 1 yêu cầu \rightarrow Server trả về 1 phản hồi rồi đóng kết nối), thì HTTP/2 của gRPC cho phép thiết lập các luồng dữ liệu (Streams) bền vững.

Tùy vào nhu cầu bài toán, gRPC hỗ trợ 4 mô hình giao tiếp khác nhau, chia làm 2 nhóm chính: gọi đơn (Unary) và truyền tải luồng (Streaming).

2. Chi tiết 4 loại Streaming trong gRPC

1. Unary RPC (Gọi đơn truyền thống)

Đây là mô hình cơ bản nhất, giống hệt với cách bạn gọi REST API thông thường.

  • Cách hoạt động: Client gửi một request lên Server \rightarrow Server xử lý và trả về một response duy nhất \rightarrow Kết thúc phiên.

  • Ví dụ thực tế: Lấy thông tin người dùng (GetUserInfo), đăng nhập hệ thống (Login).

  • Minh họa trong file .proto:

    Protocol Buffers

    rpc GetUserInfo (UserRequest) returns (UserResponse);
    
    

2. Server Streaming RPC (Máy chủ phát luồng)

Mô hình này cực kỳ hữu ích khi Client cần một lượng lớn dữ liệu hoặc dữ liệu trả về theo thời gian thực từ phía Server.

  • Cách hoạt động: Client gửi một request lên Server \rightarrow Server trả về một luồng (stream) gồm nhiều response liên tiếp. Client sẽ đọc dữ liệu từ luồng này cho đến khi Server báo kết thúc.

  • Ví dụ thực tế:

    • Ứng dụng chứng khoán gửi cập nhật giá cổ phiếu liên tục về cho app.

    • Tải xuống một file lớn, Server chia nhỏ file thành các "chunk" và stream về liên tục.

  • Minh họa trong file .proto: (Thêm từ khóa stream trước kiểu dữ liệu trả về)

    Protocol Buffers

    rpc DownloadFile (FileRequest) returns (stream FileChunk);
    
    

3. Client Streaming RPC (Client phát luồng)

Ngược lại với Server Streaming, mô hình này dùng khi Client có nhiều dữ liệu muốn gửi dần lên Server mà không muốn gửi dồn một cục làm nghẽn mạng.

  • Cách hoạt động: Client gửi một luồng các request lên Server \rightarrow Sau khi nhận và xử lý xong toàn bộ luồng, Server gửi lại một response duy nhất xác nhận.

  • Ví dụ thực tế:

    • Upload một video lớn từ điện thoại lên mây (chia nhỏ video thành các đoạn bytes gửi lên dần).

    • Gửi chuỗi dữ liệu cảm biến (IoT) liên tục từ thiết bị về server để tổng hợp.

  • Minh họa trong file .proto: (Thêm từ khóa stream trước tham số đầu vào)

    Protocol Buffers

    rpc UploadFile (stream FileChunk) returns (UploadResponse);
    
    

4. Bidirectional Streaming RPC (Luồng hai chiều thời gian thực)

Đây là mô hình mạnh mẽ và linh hoạt nhất của gRPC, cho phép cả hai bên cùng gửi và nhận dữ liệu độc lập, song song trên cùng một kết nối.

  • Cách hoạt động: Client mở một stream \rightarrow Cả Client và Server có thể tự do gửi tin nhắn cho nhau bất cứ lúc nào theo thời gian thực mà không phải đợi bên kia phản hồi trước.

  • Ví dụ thực tế:

    • Ứng dụng chat thời gian thực (như Zalo, WhatsApp, Slack).

    • Game online nhiều người chơi (gửi tọa độ di chuyển liên tục và nhận lại tọa độ của người chơi khác).

    • Hệ thống điều hướng GPS thông minh cập nhật liên tục tuyến đường.

  • Minh họa trong file .proto: (Thêm từ khóa stream ở cả hai vế)

    Protocol Buffers

    rpc ChatRoom (stream ChatMessage) returns (stream ChatMessage);
    
    

3. Tại sao Streaming của gRPC lại "ăn đứt" REST/JSON?

  • Tiết kiệm tài nguyên: Với REST, để làm real-time, bạn thường phải dùng WebSockets hoặc Server-Sent Events (SSE). Tuy nhiên, WebSockets vận hành trên một tầng giao thức khác, cấu hình khá phức tạp và khó quản lý quy mô lớn trong microservices. gRPC Streaming chạy trực tiếp trên HTTP/2 Multiplexing, tận dụng tối đa một kết nối TCP duy nhất cho nhiều stream khác nhau.

  • Tích hợp sẵn trong code: Các framework gRPC tự động sinh ra các hàm iterator/observer (như stream.Recv(), stream.Send()) trong code, giúp lập trình viên viết code xử lý luồng dữ liệu cực kỳ mượt mà, tự nhiên như đang đọc/ghi file cục bộ.

💡 Tóm tắt Bài 3:

gRPC không giới hạn ở việc gọi request-response đơn thuần. Nhờ từ khóa stream, bạn có thể dễ dàng thiết lập hệ thống truyền tải dữ liệu 1 chiều (Server/Client Streaming) hoặc 2 chiều thời gian thực (Bidirectional Streaming) một cách cực kỳ tối ưu.

Bạn thấy phần Streaming này thế nào? Ở Bài 4, chúng ta sẽ xắn tay áo lên và Xây dựng ứng dụng Microservices đầu tiên với gRPC (Coding Demo thực tế) nhé! Bạn đã sẵn sàng chư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í