gRPC в JavaScript: когда использовать и как это ускорит ваш проект

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Почему REST уже не тянет, и на сцену выходит gRPC?

Представьте: вы пишете микросервис на Node.js, который каждую секунду обменивается данными с десятком других сервисов. REST API тормозит, JSON-сериализация жрет CPU, а WebSocket для сложных RPC-вызовов превращается в адский велосипед. Знакомо?

Знакомьтесь — gRPC в JavaScript. Это не просто модная аббревиатура, а реальный инструмент, который Google создал для своих внутренних нужд, а затем открыл исходники. Сегодня мы разберем, когда использовать gRPC в JS-проектах, а когда лучше остаться на старом добром REST. Спойлер: gRPC — не серебряная пуля, но в правильных руках он творит чудеса.

Что такое gRPC простыми словами

gRPC — это фреймворк для удаленного вызова процедур (Remote Procedure Call). Вы определяете сервис и его методы в .proto файле, а затем генерируете клиентский и серверный код на любом поддерживаемом языке, включая JavaScript. В основе лежит Protocol Buffers (protobuf) — бинарный формат сериализации, который работает в разы быстрее JSON.

Ключевые фишки gRPC:

  • Бинарный протокол — данные передаются в компактном бинарном формате, а не в текстовом JSON
  • HTTP/2 — мультиплексирование, сжатие заголовков, server push
  • Строгая типизация — контракт сервиса описан в proto-файле, никаких "а вдруг поле придет или нет"
  • Четыре режима работы: unary (запрос-ответ), server streaming, client streaming, bidirectional streaming

Когда использовать gRPC в JavaScript: 5 железобетонных сценариев

1. Микросервисная архитектура с высокой нагрузкой

Если ваши микросервисы на Node.js общаются друг с другом сотни раз в секунду, gRPC дает выигрыш в производительности до 5-10 раз по сравнению с REST. За счет бинарного протокола уменьшается размер payload, а HTTP/2 позволяет не открывать новое соединение на каждый запрос.

// proto/order.proto
syntax = "proto3";

service OrderService {
  rpc CreateOrder (OrderRequest) returns (OrderResponse);
  rpc ListOrders (ListRequest) returns (stream OrderResponse);
}

message OrderRequest {
  string user_id = 1;
  repeated string item_ids = 2;
}

message OrderResponse {
  string order_id = 1;
  string status = 2;
  double total = 3;
}

message ListRequest {
  string user_id = 1;
  int32 limit = 2;
}

2. Realtime-стриминг данных

Вам нужно передавать котировки акций, логи сервера или обновления чата в реальном времени? REST с polling'ом — прошлый век. Bidirectional streaming в gRPC позволяет клиенту и серверу обмениваться сообщениями в обе стороны одновременно через одно соединение.

// Клиент на Node.js: подписка на стрим котировок
const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');

const packageDef = protoLoader.loadSync('proto/stock.proto');
const stockProto = grpc.loadPackageDefinition(packageDef).stock;

const client = new stockProto.StockService(
  'localhost:50051',
  grpc.credentials.createInsecure()
);

// Запрашиваем стрим
const call = client.SubscribePrices({ symbol: 'AAPL' });

call.on('data', (priceUpdate) => {
  console.log(`Новая цена ${priceUpdate.symbol}: $${priceUpdate.price}`);
});

call.on('end', () => {
  console.log('Стрим завершен');
});

3. Мобильные приложения с ограниченным трафиком

Каждый килобайт на счету, а JSON-ответы REST API раздуты до неприличия. Protobuf сжимает данные на 30-70% по сравнению с JSON. Это критично для мобильных клиентов на React Native или Flutter, где gRPC-web используется как прокси.

4. Полиглот-архитектура

У вас бэкенд на Go, ML-сервис на Python, а фронтенд на JavaScript (через gRPC-web)? gRPC генерирует клиентский код для всех популярных языков из одного proto-файла. Никакой ручной документации API — контракт всегда синхронизирован.

5. Системы с жесткими требованиями к latency

Если задержка в 10 мс критична (финансовые системы, гейминг, IoT), gRPC — ваш выбор. HTTP/2 multiplexing позволяет отправлять несколько запросов параллельно без блокировок, а бинарный формат сокращает время сериализации.

Когда НЕ стоит использовать gRPC в JavaScript

Честно предупреждаю: gRPC — не панацея. Вот ситуации, когда он скорее навредит:

  • Простые CRUD-приложения — для блога или интернет-магазина REST с JSON вполне достаточно. Овчинка выделки не стоит.
  • Публичные API для третьих лиц — большинство клиентов не умеют работать с gRPC. REST + OpenAPI — стандарт де-факто.
  • Браузерный клиент без прокси — gRPC-web требует специального прокси-сервера (Envoy или grpc-web), так как браузеры не поддерживают HTTP/2 напрямую для gRPC.
  • Команда не знает protobuf — если ваши разработчики никогда не работали с proto-файлами, кривая обучения может быть крутой.

Практический пример: пишем gRPC сервер и клиент на Node.js

Давайте соберем полноценный пример, чтобы вы могли запустить его локально. Это будет сервис для работы с пользователями.

Шаг 1: Установка зависимостей

npm init -y
npm install @grpc/grpc-js @grpc/proto-loader

Шаг 2: Определяем proto-файл

// proto/user.proto
syntax = "proto3";

service UserService {
  rpc GetUser (GetUserRequest) returns (User);
  rpc CreateUser (CreateUserRequest) returns (User);
  rpc ListUsers (Empty) returns (stream User);
}

message GetUserRequest {
  string id = 1;
}

message CreateUserRequest {
  string name = 1;
  string email = 2;
  int32 age = 3;
}

message User {
  string id = 1;
  string name = 2;
  string email = 3;
  int32 age = 4;
  string created_at = 5;
}

message Empty {}

Шаг 3: Серверная часть (server.js)

const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');
const { v4: uuidv4 } = require('uuid');

const packageDef = protoLoader.loadSync('proto/user.proto');
const userProto = grpc.loadPackageDefinition(packageDef);

const users = new Map();

const server = new grpc.Server();

server.addService(userProto.UserService.service, {
  GetUser: (                

Блоги

Рекомендаций по книгам