Sobes.tech
Back to questions
Senior
4

Как вы подходили к версионированию gRPC контрактов?

Companies where asked
РамблерРамблер

Answer from AI

sobes.tech AI

Версионирование gRPC контрактов в Golang обычно строится на следующих принципах:

  • Обратная совместимость: стараемся не ломать существующие сервисы и клиентов.
  • Добавление новых методов и сообщений: новые RPC и поля добавляются с новыми номерами, старые не удаляются.
  • Использование опциональных полей: новые поля в сообщениях делают опциональными, чтобы старые клиенты могли их игнорировать.
  • Версионирование пакетов или сервисов: иногда создают отдельные пакеты с версией, например v1, v2, чтобы явно отделить разные версии API.

Пример:

syntax = "proto3";
package example.v1;

service MyService {
  rpc GetData(Request) returns (Response);
}

message Request {
  int32 id = 1;
}

message Response {
  string data = 1;
  string extra_info = 2; // новое поле, опциональное
}

Если нужно изменить контракт несовместимым образом, создают новую версию сервиса, например example.v2.MyService.

Таким образом, клиенты могут постепенно мигрировать на новую версию без прерывания работы.