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

Удалённый вызов процедур

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

История

Концепция удалённого вызова процедур была впервые формально описана в 1976 году в работе Брюса Джея Нельсона «Remote Procedure Call» (диссертация в Стэнфордском университете). Нельсон предложил идею скрыть сложность сетевого взаимодействия за интерфейсом, напоминающим вызов локальной подпрограммы.

В 1980-х годах технология получила практическую реализацию. Одной из первых коммерческих систем стала Sun RPC (ONC RPC), разработанная компанией Sun Microsystems в 1985 году для операционной системы SunOS. Эта реализация стала основой для протоколов Network File System (NFS) и Network Information Service (NIS). Примерно в то же время компания Apollo Computer представила собственный протокол Network Computing System (NCS).

В 1990-е годы с развитием объектно-ориентированного программирования появились объектные расширения RPC — CORBA (Common Object Request Broker Architecture) от консорциума OMG, DCOM (Distributed Component Object Model) от Microsoft, а затем Java RMI (Remote Method Invocation) от Sun Microsystems. Эти технологии позволяли вызывать методы удалённых объектов, а не просто процедуры.

В 2000-е годы на смену тяжёлым объектным системам пришли более лёгкие протоколы на основе XML и HTTP — XML-RPC и SOAP (Simple Object Access Protocol). Они использовали текстовый формат обмена данными и могли передаваться через стандартные веб-порты, что упрощало интеграцию с интернетом.

С середины 2010-х годов популярность приобрели фреймворки нового поколения, такие как gRPC (разработан Google в 2015 году) и Apache Thrift (создан Facebook в 2007 году, открыт в 2008 году). Они используют бинарные протоколы сериализации (Protocol Buffers для gRPC, Thrift Binary Protocol) и поддерживают множество языков программирования.

Архитектура и принцип работы

Система RPC обычно включает четыре основных компонента: клиент, клиентский стаб (stub), серверный скелетон (skeleton) и сервер.

  1. Клиент — программа, которая инициирует вызов удалённой процедуры.
  2. Клиентский стаб — локальный код, который выглядит как вызываемая процедура. Он упаковывает аргументы вызова в сообщение (процесс маршаллинга, marshalling), отправляет его по сети на сервер и ожидает ответа.
  3. Серверный скелетон — код на стороне сервера, который принимает сообщение, распаковывает аргументы (демаршаллинг), вызывает реальную процедуру на сервере, упаковывает результат и отправляет его обратно.
  4. Сервер — программа, реализующая фактическую логику удалённой процедуры.

Процесс вызова состоит из следующих шагов:

Важным аспектом является обработка ошибок. Если удалённый сервер недоступен, процедура не выполняется или происходит тайм-аут, стаб должен корректно сообщить об этом вызывающему коду, обычно через исключение или код ошибки.

Классификация и виды

RPC-системы можно классифицировать по нескольким признакам.

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

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

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

По модели взаимодействия

Протоколы и реализации

Sun RPC (ONC RPC)

Одна из старейших реализаций, разработанная для UNIX-систем. Использует External Data Representation (XDR) для сериализации данных. Легла в основу NFS и NIS. В 2009 году была стандартизирована как RFC 5531.

XML-RPC

Протокол, использующий XML для кодирования вызовов и HTTP в качестве транспорта. Был создан в 1998 году компанией Microsoft и стал предшественником SOAP. Отличается простотой, но ограничен в типах данных.

SOAP (Simple Object Access Protocol)

Протокол обмена структурированными сообщениями в формате XML. Широко использовался в корпоративных системах (например, в веб-сервисах на платформе .NET). Поддерживает сложные типы данных, безопасность (WS-Security) и транзакции.

JSON-RPC

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

gRPC

Современный фреймворк от Google, основанный на HTTP/2 и Protocol Buffers. Поддерживает синхронные и асинхронные вызовы, потоковую передачу данных, двустороннюю потоковую передачу. gRPC отличается высокой производительностью и кроссплатформенностью. Широко применяется в микросервисной архитектуре.

Apache Thrift

Фреймворк, разработанный в Facebook (продукт Meta, признанной экстремистской и запрещённой в РФ). Включает собственный язык описания интерфейсов (IDL) и генерацию кода для многих языков (C++, Java, Python, PHP и др.). Поддерживает несколько протоколов (бинарный, компактный, JSON) и транспортов (TCP, HTTP).

Применение

Удалённый вызов процедур применяется в различных областях.

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

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

Недостатки

Сравнение с другими подходами

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

Другой альтернативой является асинхронный обмен сообщениями (message queue), например, RabbitMQ, Apache Kafka. В этом подходе клиент отправляет сообщение в очередь, а сервер обрабатывает его асинхронно. Это обеспечивает высокую надёжность и развязку компонентов, но не даёт прямого ответа в стиле вызова процедуры.

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

Источники

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

На главную BFOmetr →