В чем разница между server-streaming и unary в gRPC

«В чем разница между server-streaming и unary в gRPC» — вопрос из категории Сети, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Server-streaming и unary - это два разных типа RPC в gRPC:

Unary RPC - классический запрос-ответ. Клиент отправляет один запрос, сервер возвращает один ответ:

rpc GetUser (UserRequest) returns (UserResponse) {}

Server-streaming RPC - клиент отправляет один запрос, сервер возвращает поток сообщений:

rpc ListUsers (UserRequest) returns (stream UserResponse) {}

Ключевые различия:

  1. Unary - одно сообщение в ответ, server-streaming - множество
  2. Server-streaming полезен для:
    • Постепенной передачи больших данных
    • Реального времени (нотификации, обновления)
    • Сценариев "долгих опросов"

Пример server-streaming в Go:

func (s *Server) ListUsers(req *pb.UserRequest, stream pb.UserService_ListUsersServer) error {
    for _, user := range users {
        if err := stream.Send(&pb.UserResponse{User: user}); err != nil {
            return err
        }
    }
    return nil
}