Что такое RPC? Какие библиотеки знаете?cplus-3

Что такое RPC?

RPC (Remote Procedure Call) - это технология, позволяющая вызывать функции или методы на удалённой системе так, как если бы они выполнялись локально. Основная идея - абстрагировать сетевое взаимодействие, предоставив программисту интерфейс, аналогичный вызову обычных функций.

Ключевые компоненты RPC:

  1. Клиентская часть (stub) - преобразует локальный вызов в сетевое сообщение
  2. Серверная часть (skeleton) - принимает запрос и преобразует его в реальный вызов функции
  3. Сетевой транспорт - передача сообщений между клиентом и сервером
  4. Сериализация - преобразование данных в формат для передачи по сети

Основные этапы работы RPC:

  1. Клиент вызывает локальную процедуру (stub)
  2. Клиентский stub упаковывает параметры (маршалинг)
  3. Сообщение передаётся на сервер
  4. Серверный stub распаковывает параметры (анмаршалинг)
  5. Вызывается реальная процедура на сервере
  6. Результат возвращается клиенту в обратном порядке

Популярные RPC библиотеки для C++

1. gRPC

Современная кроссплатформенная RPC-библиотека от Google, использующая HTTP/2 и Protocol Buffers.

// Пример определения сервиса в .proto файле
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

Особенности:

  • Поддержка потоковой передачи данных
  • Автоматическая генерация кода
  • Поддержка множества языков программирования

2. Apache Thrift

Разработан в Facebook, поддерживает множество языков и протоколов.

// Пример определения сервиса в Thrift IDL
service Calculator {
  i32 add(1:i32 num1, 2:i32 num2),
  i32 calculate(1:i32 logid, 2:Work w) throws (1:InvalidOperation ouch),
}

Особенности:

  • Гибкость в выборе транспортных протоколов
  • Поддержка сложных структур данных
  • Встроенная поддержка пулинга соединений

3. Cap'n Proto

Альтернатива Protocol Buffers с нулевой стоимостью сериализации.

Особенности:

  • Очень высокая производительность
  • Возможность работы с данными без десериализации
  • RPC поверх Cap'n Proto

4. XML-RPC и JSON-RPC

Простые текстовые протоколы на основе XML/JSON.

// Пример JSON-RPC запроса
{
  "jsonrpc": "2.0",
  "method": "subtract",
  "params": [42, 23],
  "id": 1
}

Особенности:

  • Человекочитаемый формат
  • Простота отладки
  • Меньшая производительность по сравнению с бинарными протоколами

5. REST

Хотя REST не является классическим RPC, многие современные API реализуются поверх HTTP REST.

Критерии выбора RPC библиотеки

  1. Производительность:

    • gRPC и Cap'n Proto для высоконагруженных систем
    • XML/JSON-RPC для простых случаев
  2. Поддержка языков:

    • gRPC и Thrift для мультиязычных проектов
  3. Особенности проекта:

    • Встроенные системы: возможно, Cap'n Proto
    • Веб-интеграция: JSON-RPC или REST
  4. Экосистема:

    • gRPC имеет богатый набор расширений
    • Thrift хорош для legacy-систем

Реализация простого RPC на C++

// Серверная часть
class MathService : public RPCService {
public:
    RPCRESULT add(int a, int b) override {
        return a + b;
    }
};

// Клиентская часть
class MathClient {
public:
    int add(int a, int b) {
        RPCMessage request("add", {a, b});
        RPCMessage response = transport_->send(request);
        return response.getResult<int>();
    }
};

// Использование
MathClient client;
int result = client.add(5, 3); // Вызов удалённого метода

Проблемы и решения в RPC

  1. Латентность сети:

    • Использование асинхронных вызовов
    • Пакетные запросы
  2. Надёжность:

    • Таймауты и ретраи
    • Идемпотентные операции
  3. Совместимость версий:

    • Версионирование API
    • Обратная совместимость
  4. Безопасность:

    • Аутентификация и авторизация
    • Шифрование трафика

Резюмируем

RPC - мощная абстракция для распределённых систем, которая:

  • Упрощает разработку сетевых приложений
  • Позволяет работать с удалёнными сервисами как с локальными объектами
  • Имеет множество реализаций с разными характеристиками

Для C++ разработчиков наиболее актуальны:

  • gRPC - для современных высокопроизводительных систем
  • Thrift - для сложных мультиязычных проектов
  • Cap'n Proto - для систем с экстремальными требованиями к производительности

Выбор конкретной технологии зависит от требований проекта, необходимой производительности и экосистемы.