advanced

RPC and gRPC contracts

Используйте RPC/gRPC, когда важны explicit service methods, typed contracts, streaming, deadlines и internal service performance.

RPC-style API expose **named procedures** с типизированными контрактами — сильный вариант для internal service-to-service, где HTTP resource modeling мало даёт.

**gRPC** использует Protocol Buffers поверх HTTP/2:

					syntax = "proto3";
package orders.v1;

service OrderService {
  rpc GetOrder(GetOrderRequest) returns (Order);
  rpc ListOrders(ListOrdersRequest) returns (stream Order);
  rpc CreateOrder(CreateOrderRequest) returns (Order);
}

message GetOrderRequest { string id = 1; }
message Order { string id = 1; string status = 2; }
				

Возможности:

  • **Unary, server streaming, client streaming, bidi streaming**.
  • **Deadlines/timeouts** в metadata.
  • **Status codes** в `grpc-status` details.
  • **Code generation** для многих языков; breaking proto changes требуют дисциплины (field numbers, reserved).

Сравнение с REST: выше performance и строгие контракты; хуже ergonomics в браузере (нужен grpc-web или gateway). Для public HTTP — за API gateway.

На интервью: когда gRPC лучше REST внутри, streaming use cases, правила совместимости protobuf (не переиспользовать field numbers).

Типовые ошибки: breaking proto без version bump, гигантские messages без pagination, нет deadlines, gRPC напрямую в браузер.

Компромисс: скорость разработки в polyglot microservices против human-readable HTTP debugging — grpcurl, reflection, observability.

Чеклист:

  • Версионированные proto packages (v1, v2).
  • Deadlines на каждый client call.
  • Streaming для больших read/write.
  • Gateway или BFF для внешних клиентов.