Удаленный вызов процедуры
В распределенных вычислениях удаленный вызов процедуры ( RPC ) — это когда компьютерная программа вызывает выполнение процедуры (подпрограммы) в другом адресном пространстве (обычно на другом компьютере в общей компьютерной сети ), которая записывается так, как если бы это был обычный вызов процедуры (RPC). (локальный) вызов процедуры без явного указания программистом деталей удаленного взаимодействия. То есть программист пишет по существу один и тот же код независимо от того, является ли подпрограмма локальной по отношению к исполняемой программе или удаленной. Это форма взаимодействия клиент-сервер (вызывающая сторона — клиент , исполнитель — сервер ), обычно реализуемая через запрос-ответ систему передачи сообщений . В парадигме объектно-ориентированного программирования RPC представлены удаленным вызовом методов (RMI). Модель RPC предполагает определенный уровень прозрачности местоположения, а именно, что процедуры вызова во многом одинаковы, независимо от того, являются ли они локальными или удаленными, но обычно они не идентичны, поэтому локальные вызовы можно отличить от удаленных вызовов. Удаленные вызовы обычно на несколько порядков медленнее и менее надежны, чем местные вызовы, поэтому важно различать их.
RPC — это форма межпроцессного взаимодействия (IPC), в которой разные процессы имеют разные адресные пространства: если они находятся на одной хост-машине, они имеют разные виртуальные адресные пространства, даже если физическое адресное пространство одинаковое; а если они находятся на разных хостах, физическое адресное пространство будет разным. Для реализации этой концепции использовалось множество различных (часто несовместимых) технологий.
История и происхождение
[ редактировать ]Протоколы запросов-ответов появились на ранних этапах распределенных вычислений в конце 1960-х годов, теоретические предложения об удаленных вызовах процедур как модели сетевых операций относятся к 1970-м годам, а практические реализации относятся к началу 1980-х годов. Брюсу Джею Нельсону обычно приписывают введение термина «удаленный вызов процедуры» в 1981 году. [1]
Удаленные вызовы процедур, используемые в современных операционных системах, уходят корнями в мультипрограммную систему RC 4000. [2] который использовал протокол связи запрос-ответ для синхронизации процессов. [3] Идея рассматривать сетевые операции как удаленные вызовы процедур восходит, по крайней мере, к 1970-м годам в ранних документах ARPANET . [4] В 1978 году Пер Бринч Хансен предложил Distributed Processes — язык для распределенных вычислений, основанный на «внешних запросах», состоящих из вызовов процедур между процессами. [5]
Одна из самых ранних практических реализаций была реализована в 1982 году Брайаном Рэнделлом и его коллегами для их Newcastle Connection между машинами UNIX. [6] Вскоре за этим последовал «Люпин» Эндрю Биррелла и Брюса Нельсона в среде Cedar в Xerox PARC . [7] [8] [9] Люпин автоматически генерировал заглушки, обеспечивая типобезопасные привязки, и использовал эффективный протокол для связи. [8] Одним из первых бизнес-использований RPC была компания Xerox под названием «Courier» в 1981 году. Первой популярной реализацией RPC в Unix был RPC от Sun (теперь называемый ONC RPC), используемый в качестве основы для сетевой файловой системы (NFS).
В 1990-х годах, с ростом популярности объектно-ориентированного программирования , была широко реализована альтернативная модель удаленного вызова методов (RMI), например, в архитектуре Common Object Request Broker Architecture (CORBA, 1991) и удаленном вызове методов Java. Популярность RMI, в свою очередь, упала с развитием Интернета, особенно в 2000-х годах.
Передача сообщений
[ редактировать ]RPC — это протокол запроса-ответа. RPC инициируется клиентом , который отправляет сообщение с запросом на известный удаленный сервер для выполнения указанной процедуры с предоставленными параметрами. Удаленный сервер отправляет ответ клиенту, и приложение продолжает свою работу. Пока сервер обрабатывает вызов, клиент блокируется (он ожидает, пока сервер завершит обработку, прежде чем возобновить выполнение), если только клиент не отправит на сервер асинхронный запрос, например XMLHttpRequest. В различных реализациях существует множество вариаций и тонкостей, что приводит к появлению множества разных (несовместимых) протоколов RPC.
Важная разница между удаленными вызовами процедур и локальными вызовами заключается в том, что удаленные вызовы могут завершиться неудачей из-за непредсказуемых сетевых проблем. Кроме того, вызывающим программам обычно приходится иметь дело с такими сбоями, не зная, действительно ли была вызвана удаленная процедура. Идемпотентные процедуры (те, которые не имеют дополнительных эффектов при многократном вызове) легко обрабатываются, но остается достаточно сложностей, поскольку код для вызова удаленных процедур часто ограничивается тщательно написанными подсистемами низкого уровня.
Последовательность событий
[ редактировать ]- Клиент вызывает клиентскую заглушку. Вызов представляет собой вызов локальной процедуры, параметры которой помещаются в стек обычным способом.
- Клиентская заглушка упаковывает параметры в сообщение и выполняет системный вызов для отправки сообщения. Упаковка параметров называется маршаллингом.
- Локальная операционная система клиента отправляет сообщение с клиентского компьютера на серверный компьютер.
- Локальная операционная система на сервере передает входящие пакеты на заглушку сервера.
- Заглушка сервера распаковывает параметры из сообщения. Распаковка параметров называется демаршалингом.
- Наконец, серверная заглушка вызывает серверную процедуру. Ответ прослеживает те же шаги в обратном направлении.
Стандартные контактные механизмы
[ редактировать ]Чтобы позволить различным клиентам получать доступ к серверам, был создан ряд стандартизированных систем RPC. Большинство из них используют язык описания интерфейса (IDL), позволяющий различным платформам вызывать RPC. Затем файлы IDL можно использовать для создания кода для взаимодействия между клиентом и серверами.
Аналоги
[ редактировать ]Этот раздел нуждается в дополнительных цитатах для проверки . ( декабрь 2013 г. ) |
Известные реализации и аналоги RPC включают:
Языковой
[ редактировать ]- API удаленного вызова методов Java (Java RMI) Java предоставляет функциональность, аналогичную стандартным методам RPC Unix.
- Go предоставляет пакет rpc для реализации RPC с поддержкой асинхронных вызовов.
- Сетевые объекты Модулы-3, которые легли в основу Java RMI. [10]
- RPyC реализует механизмы RPC на Python с поддержкой асинхронных вызовов.
- Распределенный Ruby (DRb) позволяет программам Ruby взаимодействовать друг с другом на одном компьютере или по сети. DRb использует удаленный вызов методов (RMI) для передачи команд и данных между процессами.
- Erlang ориентирован на процессы и изначально поддерживает распространение и RPC посредством передачи сообщений между узлами и локальными процессами.
- Elixir построен на базе виртуальной машины Erlang и обеспечивает взаимодействие процессов (процессов Elixir/Erlang, а не процессов ОС) в одной и той же сети «из коробки» через агентов и передачу сообщений.
- Платформа Rust RPC от Google Tarpc позволяет разработчикам определять структуру сообщений, используя структуры и признаки Rust, а не protobuf. [11]
Для конкретного приложения
[ редактировать ]- Формат сообщения действия (AMF) позволяет приложениям Adobe Flex взаимодействовать с серверными компонентами или другими приложениями, поддерживающими AMF.
- Удаленный вызов функций — это стандартный интерфейс SAP для связи между системами SAP. RFC вызывает функцию, которая будет выполнена в удаленной системе.
Общий
[ редактировать ]- NFS (сетевая файловая система) – один из наиболее известных пользователей RPC.
- Открытые сетевые вычисления RPC от Sun Microsystems (также известный как Sun RPC)
- Программа IPC с открытым исходным кодом D-Bus обеспечивает функции, аналогичные CORBA.
- SORCER предоставляет API и язык, ориентированный на напряжение (EOL) для вызова объединенных методов.
- XML-RPC — это протокол RPC, который использует XML для кодирования вызовов и HTTP в качестве транспортного механизма.
- JSON-RPC — это протокол RPC, который использует сообщения в формате JSON.
- JSON-WSP — это протокол RPC, созданный на основе JSON-RPC.
- SOAP является преемником XML-RPC и также использует XML для кодирования вызовов на основе HTTP.
- Платформа распределенных вычислений ZeroC Internet Communications Engine (Ice).
- Платформа Etch для создания сетевых сервисов.
- Протокол и платформа Apache Thrift.
- CORBA обеспечивает удаленный вызов процедур через промежуточный уровень, называемый брокером объектных запросов .
- Libevent предоставляет основу для создания серверов и клиентов RPC. [12]
- Windows Communication Foundation — это интерфейс прикладного программирования в среде .NET для создания подключенных сервис-ориентированных приложений.
- Microsoft .NET Remoting предлагает возможности RPC для распределенных систем, реализованных на платформе Windows. Он был заменен WCF .
- Microsoft DCOM использует MSRPC, основанный на DCE/RPC.
- Распределенная вычислительная среда Open Software Foundation DCE/RPC (также реализованная Microsoft).
- Пакет Google Protocol Buffers (protobufs) включает язык определения интерфейса, используемый для его протоколов RPC. [13] с открытым исходным кодом в 2015 году как gRPC. [14]
- WAMP объединяет RPC и публикацию-подписку в единый протокол, независимый от транспорта.
- Google Web Toolkit использует асинхронный RPC для связи со службой сервера. [15]
- Apache Avro предоставляет RPC, где схемы обмена клиентом и сервером при подтверждении соединения и генерации кода не требуются.
См. также
[ редактировать ]- 9П
- Microsoft RPC
- Локальное межпроцессное взаимодействие
- HTTP
- ОДБК
- Дистанционная оценка
- Представление внешних данных (формат сериализации, используемый, например, NFS)
- Представление сетевых данных (формат сериализации, используемый, например, Microsoft RPC)
- Ресурсно-ориентированная архитектура
- Промежуточное программное обеспечение распределенных объектов
- Фрагментированный объект
- gRPC
Ссылки
[ редактировать ]- ^ Брюс Джей Нельсон (май 1981 г.). Удаленный вызов процедур (кандидатская диссертация). Исследовательский центр Xerox в Пало-Альто. ПАРК CSL-81-9 (также CMU-CS-81-119).
- ^ «Пер Бринч Хансен • Компьютерное общество IEEE» . www.computer.org . Проверено 15 декабря 2015 г.
- ^ Бринч Хансен, Пер (1969). Компьютерное программное обеспечение RC 4000: система мультипрограммирования (PDF) . Копенгаген, Дания: Regnecentralen.
- ^ Джеймс Э. Уайт (23 декабря 1975 г.). «Высокоуровневая структура совместного использования сетевых ресурсов» . РФК 707 . Исследовательский центр аугментации . дои : 10.17487/RFC0707 . Проверено 11 июля 2011 г.
- ^ Бринч Хансен, Пер (ноябрь 1978 г.). «Распределенные процессы: концепция параллельного программирования» (PDF) . Коммуникации АКМ . 21 (11): 934–941. CiteSeerX 10.1.1.107.3108 . дои : 10.1145/359642.359651 . S2CID 11610744 .
- ^ Браунбридж, Дэвид Р.; Маршалл, Линдси Ф.; Рэнделл, Брайан (1982). «Связь с Ньюкаслом» (PDF) . Программное обеспечение: практика и опыт . 12 (12): 1147–1162. дои : 10.1002/спе.4380121206 . S2CID 1840438 . Архивировано из оригинала (PDF) 16 августа 2016 г. Проверено 16 августа 2016 г.
- ^ Биррелл, Эндрю Д.; Нельсон, Брюс Джей (1984). «Реализация удаленных вызовов процедур» (PDF) . Транзакции ACM в компьютерных системах . 2 : 39–59. дои : 10.1145/2080.357392 . S2CID 11525846 .
- ^ Jump up to: а б «1994 – Эндрю Биррелл, Брюс Нельсон: Удаленный вызов процедур» . Цитирование премии Software System Award . Ассоциация вычислительной техники . Архивировано из оригинала 2 апреля 2012 года . Проверено 11 июля 2011 г.
- ^ «Награда Зала славы СИГОПС» . Специальная группа по интересам по операционным системам . Ассоциация вычислительной техники . Проверено 11 июля 2011 г.
- ^ AZ языков программирования: Modula-3 — az языков программирования . Архивировано 5 января 2009 г. в Wayback Machine . Компьютерный мир. Проверено 17 июля 2013 г.
- ^ tarpc , Google, 2 ноября 2023 г. , получено 2 ноября 2023 г.
- ^ libevent: Главная страница . Обезьянка.орг. Проверено 17 июля 2013 г.
- ^ «Буферы протокола — формат обмена данными Google» . Сайт проекта Google . Проверено 1 ноября 2011 г.
- ^ «Универсальная платформа RPC с открытым исходным кодом gRPC» . Сайт проекта Google . Проверено 7 сентября 2016 г.
- ^ «Набор веб-инструментов Google» . Сайт проекта Google . Проверено 1 ноября 2011 г.
Внешние ссылки
[ редактировать ]- RFC 5531 — указывает версию 2 ONC RPC (четвертая опубликованная версия RFC).
- RFC 1831 — указывает версию 2 ONC RPC (третья опубликованная версия RFC).
- RFC 1057 — указывает версию 2 ONC RPC (вторая опубликованная версия RFC).
- RFC 1050 — указывает версию 2 ONC RPC (первая опубликованная версия RFC).
- Удаленные вызовы процедур (RPC) — Учебное пособие по ONC RPC доктора Дэйва Маршалла из Кардиффского университета.
- Введение в программирование RPC — введение разработчика в RPC и XDR из документации SGI IRIX.