Cách gRPC Streaming Có Thể Làm Cho API Của Bạn Nhanh Hơn Và Đáng Tin Cậy Hơn

Tìm hiểu về gRPC streaming, cách nó hoạt động và lợi ích của nó cho API của bạn. Cũng tìm hiểu cách sử dụng apidog để kiểm tra và gỡ lỗi các dịch vụ gRPC streaming của bạn.

Minh Triết

Minh Triết

5 tháng 6 2025

Cách gRPC Streaming Có Thể Làm Cho API Của Bạn Nhanh Hơn Và Đáng Tin Cậy Hơn

Nếu bạn đang tìm cách cải thiện hiệu suất và độ tin cậy của các API của mình, bạn có thể muốn xem xét việc sử dụng gRPC streaming. gRPC là một framework hiện đại, mã nguồn mở cho phép bạn tạo ra các dịch vụ hiệu quả và có khả năng mở rộng bằng cách sử dụng protocol buffers và HTTP/2. Streaming là một trong những tính năng chính của gRPC cho phép bạn gửi và nhận nhiều tin nhắn trong một kết nối duy nhất, mà không cần chờ mỗi phản hồi.

Trong bài viết trên blog này, tôi sẽ giải thích gRPC streaming là gì, cách nó hoạt động và tại sao nó có lợi cho các API của bạn. Tôi cũng sẽ chỉ cho bạn cách sử dụng một công cụ gọi là apidog để kiểm tra và gỡ lỗi các dịch vụ gRPC streaming của bạn. Cuối bài viết này, bạn sẽ có cái nhìn rõ hơn về gRPC streaming và cách sử dụng nó trong các dự án của mình.

button

gRPC Streaming là gì?

gRPC streaming là cách gửi và nhận nhiều tin nhắn trong một kết nối duy nhất, sử dụng HTTP/2 như giao thức vận chuyển cơ sở. HTTP/2 là một phiên bản mới hơn của HTTP hỗ trợ multiplexing, có nghĩa là nhiều yêu cầu và phản hồi có thể được gửi qua cùng một kết nối TCP, mà không làm chặn lẫn nhau. Điều này giảm thiểu độ trễ mở và đóng kết nối, và cải thiện độ trễ và thông lượng của các API của bạn.

gRPC streaming cho phép bạn sử dụng bốn loại mẫu giao tiếp:

gRPC Streaming hoạt động như thế nào?

gRPC streaming hoạt động bằng cách sử dụng protocol buffers và HTTP/2 để mã hóa và vận chuyển các tin nhắn. Protocol buffers là một định dạng tuần tự nhị phân cho phép bạn định nghĩa cấu trúc và loại tin nhắn của mình trong một tệp schema. Protocol buffers gọn nhẹ, nhanh và dễ sử dụng, và chúng hỗ trợ khả năng tương thích đa ngôn ngữ và đa nền tảng.

HTTP/2 là một giao thức nhị phân hỗ trợ multiplexing, nén và mã hóa. HTTP/2 cho phép bạn gửi nhiều tin nhắn qua cùng một kết nối, sử dụng frame như đơn vị cơ bản của giao tiếp. Mỗi frame có một tiêu đề chỉ định loại, độ dài, và ID dòng của frame. ID dòng là một định danh duy nhất liên kết một frame với một yêu cầu hoặc phản hồi cụ thể. HTTP/2 cũng hỗ trợ kiểm soát lưu lượng và xử lý lỗi, giúp đảm bảo độ tin cậy và hiệu quả của các API của bạn.

Để sử dụng gRPC streaming, bạn cần định nghĩa dịch vụ và các tin nhắn của bạn trong một tệp protocol buffer, sử dụng cú pháp gRPC. Ví dụ, đây là một dịch vụ đơn giản hỗ trợ các cuộc gọi unary và server streaming:

syntax = "proto3";

package example;

// Dịch vụ trả về thời gian hiện tại
service TimeService {
  // Cuộc gọi unary: trả về thời gian hiện tại
  rpc GetTime (GetTimeRequest) returns (GetTimeResponse) {}

  // Cuộc gọi server streaming: trả về thời gian hiện tại mỗi giây
  rpc StreamTime (StreamTimeRequest) returns (stream StreamTimeResponse) {}
}

// Một tin nhắn đại diện cho yêu cầu lấy thời gian hiện tại
message GetTimeRequest {
  // Múi giờ của thời gian được yêu cầu
  string timezone = 1;
}

// Một tin nhắn đại diện cho phản hồi với thời gian hiện tại
message GetTimeResponse {
  // Thời gian hiện tại theo định dạng ISO 8601
  string time = 1;
}

// Một tin nhắn đại diện cho yêu cầu stream thời gian hiện tại
message StreamTimeRequest {
  // Múi giờ của thời gian được yêu cầu
  string timezone = 1;
}

// Một tin nhắn đại diện cho phản hồi với thời gian hiện tại
message StreamTimeResponse {
  // Thời gian hiện tại theo định dạng ISO 8601
  string time = 1;
}

Để triển khai dịch vụ của bạn, bạn cần sử dụng một thư viện gRPC cho ngôn ngữ lập trình mà bạn chọn. gRPC hỗ trợ nhiều ngôn ngữ, như C#, C++, Go, Java, Node.js, Python, Ruby, và nhiều hơn nữa. Mỗi ngôn ngữ có API và quy ước riêng để tạo ra và tiêu thụ các dịch vụ gRPC. Ví dụ, đây là một triển khai đơn giản của TimeService trong Python:

import grpc
import time
from concurrent import futures
from example_pb2 import GetTimeRequest, GetTimeResponse, StreamTimeRequest, StreamTimeResponse
from example_pb2_grpc import TimeServiceServicer, add_TimeServiceServicer_to_server

# Một lớp triển khai TimeService
class TimeService(TimeServiceServicer):
  # Cuộc gọi unary: trả về thời gian hiện tại
  def GetTime(self, request, context):
    # Lấy múi giờ từ yêu cầu
    timezone = request.timezone
    # Lấy thời gian hiện tại theo múi giờ yêu cầu
    time = get_current_time(timezone)
    # Tạo và trả về phản hồi với thời gian hiện tại
    response = GetTimeResponse(time=time)
    return response

  # Cuộc gọi server streaming: trả về thời gian hiện tại mỗi giây
  def StreamTime(self, request, context):
    # Lấy múi giờ từ yêu cầu
    timezone = request.timezone
    # Vòng lặp vô hạn
    while True:
      # Lấy thời gian hiện tại theo múi giờ yêu cầu
      time = get_current_time(timezone)
      # Tạo và trả về phản hồi với thời gian hiện tại
      response = StreamTimeResponse(time=time)
      yield response
      # Chờ một giây
      time.sleep(1)

# Một hàm trả về thời gian hiện tại theo múi giờ nhất định
def get_current_time(timezone):
  # TODO: triển khai hàm này
  pass

# Tạo một server gRPC
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
# Thêm TimeService vào server
add_TimeServiceServicer_to_server(TimeService(), server)
# Bắt đầu server trên cổng 50051
server.add_insecure_port('[::]:50051')
server.start()
# Chờ cho đến khi dừng
server.wait_for_termination()

Để tiêu thụ dịch vụ của bạn, bạn cần sử dụng một client gRPC cho ngôn ngữ lập trình mà bạn chọn. Các client gRPC sử dụng các stub để giao tiếp với các server gRPC. Các stub được tạo ra từ tệp protocol buffer, và chúng cung cấp các phương thức tương ứng với các phương thức dịch vụ. Ví dụ, đây là một client đơn giản gọi TimeService trong Python:

import grpc
from example_pb2 import GetTimeRequest, StreamTimeRequest
from example_pb2_grpc import TimeServiceStub

# Tạo một kênh gRPC đến server
channel = grpc.insecure_channel('localhost:50051')
# Tạo một stub cho TimeService
stub = TimeServiceStub(channel)

# Cuộc gọi unary: lấy thời gian hiện tại ở UTC
request = GetTimeRequest(timezone='UTC')
response = stub.GetTime(request)
print(f'Thời gian hiện tại ở UTC là {response.time}')

# Cuộc gọi server streaming: stream thời gian hiện tại ở PST
request = StreamTimeRequest(timezone='PST')
responses = stub.StreamTime(request)
for response in responses:
  print(f'Thời gian hiện tại ở PST là {response.time}')

Tại sao nên sử dụng gRPC Streaming?

gRPC streaming mang lại nhiều lợi ích cho các API của bạn, chẳng hạn như:

Cách kiểm tra và gỡ lỗi các dịch vụ gRPC Streaming?

Kiểm tra và gỡ lỗi các dịch vụ gRPC streaming có thể là một thách thức, đặc biệt nếu bạn đang sử dụng các ngôn ngữ và nền tảng khác nhau. May mắn thay, có một công cụ có thể giúp bạn với điều đó: Apidog.

button

Apidog là một công cụ web cho phép bạn kiểm tra và gỡ lỗi các dịch vụ gRPC streaming của bạn, bằng cách sử dụng một giao diện đơn giản và trực quan. apidog hỗ trợ nhiều ngôn ngữ, chẳng hạn như C#, C++, Go, Java, Node.js, Python, Ruby, và nhiều hơn nữa. Apidog cũng hỗ trợ các mẫu giao tiếp khác nhau, chẳng hạn như unary, server streaming, client streaming và bidirectional streaming.

Với apidog, bạn có thể:

Server Streaming

Apidog là một công cụ mạnh mẽ và dễ sử dụng có thể giúp bạn kiểm tra và gỡ lỗi các dịch vụ gRPC streaming của bạn, và đảm bảo rằng chúng hoạt động như mong đợi.

Kết luận

gRPC streaming là một tính năng có thể giúp các API của bạn nhanh hơn và đáng tin cậy hơn, bằng cách cho phép bạn gửi và nhận nhiều tin nhắn trong một kết nối duy nhất, sử dụng HTTP/2 và protocol buffers. gRPC streaming cũng mang lại cho bạn tính linh hoạt và đơn giản, bằng cách cho phép bạn sử dụng các mẫu giao tiếp và ngôn ngữ khác nhau, và bằng cách cung cấp cho bạn một API nhất quán và trực quan. gRPC streaming là một lựa chọn tuyệt vời cho các API của bạn, đặc biệt nếu bạn cần xử lý một lượng lớn dữ liệu, cập nhật theo thời gian thực, hoặc tương tác phức tạp.

Nếu bạn muốn tìm hiểu thêm về gRPC streaming, bạn có thể xem tài liệu chính thức tại https://grpc.io/docs. Nếu bạn muốn kiểm tra và gỡ lỗi các dịch vụ gRPC streaming của mình, bạn có thể sử dụng Apidog, một công cụ web cho phép bạn kết nối, gửi, nhận, giám sát và gỡ lỗi các dịch vụ gRPC streaming của bạn, bằng một giao diện đơn giản và trực quan. Bạn có thể thử apidog miễn phí.

button

Thực hành thiết kế API trong Apidog

Khám phá cách dễ dàng hơn để xây dựng và sử dụng API