Открыть сервис

протокол удалённого вызова процедур

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

История

Концепция удалённого вызова процедур была впервые формализована в 1970-х годах в рамках исследований в области распределённых вычислений. Одним из первых практических воплощений стала система Birrell–Nelson RPC, разработанная в 1984 году в Xerox PARC. Она заложила основы для синхронного вызова, сериализации данных и обработки ошибок. В 1980-х годах компания Sun Microsystems внедрила протокол ONC RPC (Open Network Computing Remote Procedure Call), который стал стандартом для Unix-систем и использовался в таких службах, как NFS (Network File System). В 1990-х годах корпорация Microsoft разработала DCE/RPC (Distributed Computing Environment / Remote Procedure Call) и его расширение — COM/DCOM (Component Object Model / Distributed COM), которые активно применялись в Windows-среде. С развитием интернета и веб-сервисов в начале 2000-х годов появились протоколы XML-RPC и SOAP (Simple Object Access Protocol), основанные на XML-сообщениях. В 2010-х годах с ростом популярности микросервисных архитектур и высокопроизводительных систем был разработан gRPC (от Google), использующий Protocol Buffers для сериализации и HTTP/2 для транспорта.

Принцип работы

Протокол RPC реализует модель «клиент-сервер», где клиентская программа вызывает удалённую процедуру, а серверная — выполняет её и возвращает результат. Процесс включает несколько этапов:

  1. Сериализация параметровпреобразование данных (например, чисел, строк, структур) в формат, пригодный для передачи по сети (например, JSON, XML, Protocol Buffers).
  2. Передача запроса — отправка сериализованных данных на сервер через транспортный протокол (TCP, UDP, HTTP/2).
  3. Демультиплексирование — сервер идентифицирует вызываемую процедуру по идентификатору, переданному в запросе.
  4. Выполнение процедуры — сервер запускает соответствующую функцию, передавая ей десериализованные параметры.
  5. Сериализация ответа — результат выполнения процедуры преобразуется в формат для передачи обратно.
  6. Передача ответа — сервер отправляет сериализованный результат клиенту.
  7. Десериализация и возврат — клиент получает ответ, преобразует его в локальные типы данных и возвращает вызывающему коду.

Для обеспечения прозрачности RPC использует стаб-функции (stubs): на стороне клиента — клиентский стаб (proxy), который имитирует локальную процедуру, а на стороне сервера — серверный стаб (skeleton), который вызывает реальную реализацию. Стабы генерируются автоматически на основе интерфейсного описания (например, IDL — Interface Definition Language).

Классификация протоколов RPC

Протоколы RPC могут классифицироваться по нескольким признакам:

По типу синхронности

  • Синхронные — клиент блокирует выполнение до получения ответа от сервера. Это классический и наиболее распространённый тип.
  • Асинхронные — клиент отправляет запрос и продолжает работу, не дожидаясь ответа. Результат может быть получен через callback, future или опрос.
  • Однонаправленные (fire-and-forget) — клиент отправляет запрос без ожидания ответа, что используется для уведомлений или событий.

По формату сериализации

  • Текстовые — данные передаются в читаемом формате (XML, JSON). Примеры: XML-RPC, SOAP, JSON-RPC. Медленнее, но удобнее для отладки.
  • Бинарные — данные передаются в компактном бинарном формате (Protocol Buffers, Thrift, Avro). Быстрее и эффективнее по размеру, но сложнее в отладке.

По транспортному протоколу

  • На основе TCP — обеспечивают надёжную доставку, но могут быть медленнее из-за установки соединения.
  • На основе UDP — быстрее, но не гарантируют доставку или порядок сообщений.
  • На основе HTTP/2 — современные протоколы (например, gRPC) используют HTTP/2 для мультиплексирования и потоковой передачи.

По архитектуре

  • Двухзвенные — прямое взаимодействие клиента и сервера.
  • Многоуровневые — запросы могут проходить через промежуточные серверы (например, в микросервисных архитектурах с балансировщиками нагрузки).

Основные протоколы и реализации

ONC RPC (Open Network Computing RPC)

Разработан Sun Microsystems в 1980-х годах. Использует XDR (External Data Representation) для сериализации. Широко применялся в NFS и NIS (Network Information Service). Работает поверх TCP или UDP. Является одним из старейших стандартов.

DCE/RPC (Distributed Computing Environment RPC)

Стандарт, разработанный Open Software Foundation (OSF) в 1990-х годах. Использует IDL для описания интерфейсов. Лёг в основу Microsoft RPC и COM/DCOM. Применялся в Windows-среде для межпроцессного взаимодействия.

XML-RPC

Протокол, созданный в 1998 году компанией UserLand Software. Использует XML для кодирования вызовов и HTTP в качестве транспорта. Прост и удобен, но менее производителен из-за текстового формата. Применялся в ранних веб-сервисах и системах управления контентом (например, WordPress).

SOAP (Simple Object Access Protocol)

Разработан консорциумом W3C в начале 2000-х годов. Основан на XML и поддерживает сложные типы данных, безопасность (WS-Security) и транзакции. Использует HTTP, SMTP или другие протоколы. Был популярен в корпоративных приложениях, но впоследствии вытеснен более лёгкими решениями.

JSON-RPC

Лёгкий протокол, использующий JSON для сериализации. Работает поверх HTTP, TCP или WebSockets. Поддерживает как синхронные, так и асинхронные вызовы. Применяется в веб-приложениях и API.

gRPC

Разработан компанией Google в 2015 году. Использует Protocol Buffers для сериализации и HTTP/2 для транспорта. Поддерживает потоковую передачу (однонаправленную, двунаправленную) и асинхронные вызовы. Написан на C++, но имеет клиентские библиотеки для многих языков (Go, Java, Python, C# и др.). Активно применяется в микросервисных архитектурах, облачных вычислениях и системах реального времени.

Apache Thrift

Разработан Facebook (продукт Meta, признанной экстремистской и запрещённой в РФ) в 2007 году, открыт в 2008 году. Позволяет определять типы данных и интерфейсы в IDL, генерировать код для различных языков. Поддерживает бинарные и текстовые протоколы, а также транспортные уровни (TCP, HTTP, сжатие). Используется в крупных распределённых системах, таких как Apache Cassandra и Apache Hadoop.

Применение

Протоколы RPC широко применяются в различных областях информационных технологий:

  • Микросервисные архитектуры — gRPC и Thrift используются для взаимодействия между микросервисами благодаря высокой производительности и поддержке потоковой передачи.
  • Облачные вычисления — RPC-протоколы лежат в основе API облачных провайдеров (например, Google Cloud Pub/Sub, AWS Lambda).
  • Базы данных — распределённые базы данных (например, CockroachDB, TiDB) используют RPC для координации узлов и репликации данных.
  • Системы реального времени — gRPC с двунаправленной потоковой передачей применяется в чатах, онлайн-играх и IoT-системах.
  • Веб-сервисы — SOAP и XML-RPC используются в корпоративных веб-сервисах, особенно в финансовом и банковском секторах.
  • Операционные системы — DCE/RPC и Microsoft RPC применяются для межпроцессного взаимодействия в Windows.

Преимущества и недостатки

Преимущества

  • Прозрачность — разработчик может вызывать удалённые процедуры так же, как локальные, что упрощает создание распределённых приложений.
  • Стандартизация — многие протоколы (gRPC, Thrift) имеют чёткие спецификации и генераторы кода, что снижает вероятность ошибок.
  • Производительность — бинарные протоколы (Protocol Buffers, Thrift) обеспечивают высокую скорость сериализации и малый размер сообщений.
  • Кроссплатформенность — RPC-протоколы поддерживают множество языков программирования и операционных систем.

Недостатки

  • Сложность отладки — при ошибках в сети или на сервере трудно определить причину сбоя, особенно в синхронных вызовах.
  • Зависимость от сети — задержки, потери пакетов и разрывы соединения могут нарушить работу приложения.
  • Проблемы с безопасностью — RPC-протоколы требуют аутентификации, шифрования и защиты от атак (например, подделки запросов).
  • Ограниченная гибкость — при изменении интерфейса необходимо обновлять стабы на всех клиентах и серверах.

Сравнение с другими технологиями

Протоколы RPC часто сравнивают с REST (Representational State Transfer) — архитектурным стилем для веб-сервисов. REST использует HTTP-методы (GET, POST, PUT, DELETE) и ресурсно-ориентированный подход, в то время как RPC фокусируется на вызове процедур. RPC обычно быстрее и эффективнее для сложных операций, но REST более гибок и прост в кэшировании. В микросервисных архитектурах часто используют комбинацию: gRPC для внутренних вызовов и REST для внешних API.

Интересные факты

  • Протокол gRPC был разработан Google для внутренних нужд, но открыт в 2015 году. Он используется в таких продуктах, как Google Cloud, Kubernetes и Netflix.
  • Apache Thrift изначально создавался для решения проблем с производительностью в Facebook, где требовалось обрабатывать миллионы запросов в секунду.
  • XML-RPC считается предшественником SOAP и был одним из первых протоколов, позволивших веб-приложениям взаимодействовать через HTTP.
  • В 2020 году компания Microsoft объявила о прекращении поддержки Windows Communication Foundation (WCF), который базировался на SOAP, в пользу gRPC и REST.

Источники

  • Birrell, A. D., & Nelson, B. J. (1984). Implementing Remote Procedure Calls. ACM Transactions on Computer Systems, 2(1), 39–59.
  • Tanenbaum, A. S., & Van Steen, M. (2007). Distributed Systems: Principles and Paradigms (2nd ed.). Pearson.
  • gRPC Documentation. (2023). gRPC: A high-performance, open-source universal RPC framework. Google.
  • Apache Thrift. (2023). Apache Thrift: A software framework for scalable cross-language services development. Apache Software Foundation.
  • W3C. (2007). SOAP Version 1.2 Part 1: Messaging Framework (2nd ed.). World Wide Web Consortium.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →