Ответ
Server-streaming и unary - это два разных типа RPC в gRPC:
Unary RPC - классический запрос-ответ. Клиент отправляет один запрос, сервер возвращает один ответ:
rpc GetUser (UserRequest) returns (UserResponse) {}
Server-streaming RPC - клиент отправляет один запрос, сервер возвращает поток сообщений:
rpc ListUsers (UserRequest) returns (stream UserResponse) {}
Ключевые различия:
- Unary - одно сообщение в ответ, server-streaming - множество
- 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
}