Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

В распределенных вычислений , A удаленный вызов процедур ( RPC ), когда компьютерная программа вызывает процедуру ( подпрограмму ) , чтобы выполнить в другом адресном пространстве ( как правило , на другом компьютере в общей сети), которая кодируется , как если бы это был обычный ( local), без явного кодирования программистом деталей для удаленного взаимодействия. То есть программист пишет по существу один и тот же код, независимо от того, является ли подпрограмма локальной по отношению к исполняющейся программе или удаленной. Это форма взаимодействия клиент-сервер (вызывающий - клиент, исполнитель - сервер), обычно реализуемая через систему передачи сообщений запрос – ответ. В парадигме объектно-ориентированного программирования RPC представлены удаленным вызовом метода.(RMI). Модель RPC подразумевает уровень прозрачности местоположения , а именно то, что процедуры вызова в основном одинаковы, независимо от того, являются ли они локальными или удаленными, но обычно они не идентичны, поэтому локальные вызовы можно отличить от удаленных вызовов. Удаленные вызовы обычно на несколько порядков медленнее и менее надежны, чем местные вызовы, поэтому важно их различать.

RPC - это форма межпроцессного взаимодействия (IPC), в которой разные процессы имеют разные адресные пространства: если они находятся на одной и той же главной машине, они имеют разные виртуальные адресные пространства, даже если физическое адресное пространство одинаково; тогда как если они находятся на разных хостах, физическое адресное пространство другое. Для реализации этой концепции использовалось множество различных (часто несовместимых) технологий.

История и происхождение [ править ]

Протоколы «запрос-ответ» относятся к ранним распределенным вычислениям в конце 1960-х годов, теоретические предложения о вызовах удаленных процедур в качестве модели сетевых операций относятся к 1970-м годам, а практические реализации относятся к началу 1980-х годов. Брюсу Джею Нельсону обычно приписывают введение термина «удаленный вызов процедуры» в 1981 г. [1]

Удаленные вызовы процедур , используемых в современных операционных системах проследить их корни назад к мультипрограммирования системы RC - 4000 , [2] , который используется протокол связи запрос-ответ для синхронизации процессов. [3] Идея обработки сетевых операций как удаленных вызовов процедур восходит, по крайней мере, к 1970-м годам в ранних документах ARPANET . [4] В 1978 году Пер Бринч Хансен предложил «Распределенные процессы», язык для распределенных вычислений, основанный на «внешних запросах», состоящих из вызовов процедур между процессами. [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), например, в общей архитектуре посредника объектных запросов (CORBA, 1991) и удаленном вызове методов Java . Популярность RMI, в свою очередь, упала с появлением Интернета, особенно в 2000-х годах.

Передача сообщений [ править ]

RPC - это протокол запроса-ответа . RPC инициируется клиентом , который отправляет сообщение запроса известному удаленному серверу для выполнения указанной процедуры с предоставленными параметрами. Удаленный сервер отправляет ответ клиенту, и приложение продолжает свой процесс. Пока сервер обрабатывает вызов, клиент блокируется (он ждет, пока сервер завершит обработку, прежде чем возобновить выполнение), если только клиент не отправит серверу асинхронный запрос, например XMLHttpRequest . Существует множество вариаций и тонкостей в различных реализациях, что приводит к множеству различных (несовместимых) протоколов RPC.

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

Последовательность событий [ править ]

  1. Клиент вызывает клиентскую заглушку . Вызов - это вызов локальной процедуры, с параметрами, помещенными в стек обычным способом.
  2. Клиент заглушка упаковывает параметры в сообщение и делает системный вызов , чтобы отправить сообщение. Упаковка параметров называется маршалингом .
  3. Локальная операционная система клиента отправляет сообщение с клиентского компьютера на сервер.
  4. Локальная операционная система на сервере передает входящие пакеты на заглушку сервера .
  5. Заглушка сервера распаковывает параметры из сообщения. Распаковка параметров называется демаршалингом .
  6. Наконец, заглушка сервера вызывает процедуру сервера. В ответе прослеживаются те же шаги в обратном направлении.

Стандартные механизмы связи [ править ]

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

Аналоги [ править ]

Известные реализации и аналоги RPC включают:

Зависит от языка [ править ]

  • Java , «с Java Удаленный Вызов метода API (Java RMI) предоставляет аналогичные функциональные возможности стандартных методов Unix - RPC.
  • Go предоставляет пакет rpc для реализации RPC с поддержкой асинхронных вызовов.
  • Сетевые объекты Modula-3 , которые легли в основу Java RMI [10]
  • RPyC реализует механизмы RPC в Python с поддержкой асинхронных вызовов.
  • Распределенный Ruby (DRb) позволяет программам Ruby взаимодействовать друг с другом на одной машине или по сети. DRb использует вызов удаленного метода (RMI) для передачи команд и данных между процессами.
  • Erlang ориентирован на процессы и изначально поддерживает распространение и RPC через передачу сообщений между узлами и локальными процессами.
  • Elixir построен на основе виртуальной машины Erlang и обеспечивает взаимодействие процессов (процессы Elixir / Erlang, а не процессы ОС) одной и той же сети прямо из коробки через агентов и передачу сообщений.

Для конкретного приложения [ править ]

  • Действие Формат сообщений (AMF) позволяет Adobe Flex приложения для взаимодействия с обратными концами или другими приложениями, поддерживающее AMF.
  • Удаленный вызов функций - это стандартный интерфейс SAP для связи между системами SAP. RFC вызывает функцию, которая должна выполняться в удаленной системе.

Общие [ править ]

  • NFS ( сетевая файловая система ) - один из самых известных пользователей RPC.
  • Вызов удаленных процедур открытых сетевых вычислений , Sun Microsystems
  • Программа IPC с открытым исходным кодом D-Bus предоставляет функции, аналогичные CORBA .
  • SORCER предоставляет API и язык, ориентированный на работу (EOL), для вызова федеративного метода.
  • XML-RPC - это протокол RPC, который использует XML для кодирования своих вызовов и HTTP в качестве транспортного механизма.
  • JSON-RPC - это протокол RPC, который использует сообщения в кодировке JSON.
  • JSON-WSP - это протокол RPC, использующий сообщения в кодировке JSON.
  • SOAP является преемником XML-RPC и также использует XML для кодирования своих HTTP-вызовов.
  • ZeroC «s Internet Communications Engine (Ice) , распределенных вычислительных платформы.
  • Фреймворк Etch для построения сетевых сервисов.
  • Протокол и фреймворк Apache Thrift .
  • CORBA обеспечивает удаленный вызов процедур через промежуточный уровень, называемый посредником объектных запросов .
  • Libevent предоставляет основу для создания серверов и клиентов RPC. [11]
  • Windows Communication Foundation - это интерфейс прикладного программирования в платформе .NET для создания связанных сервисно-ориентированных приложений.
  • Microsoft .NET Remoting предлагает средства RPC для распределенных систем, реализованные на платформе Windows. Он был заменен WCF .
  • Microsoft DCOM использует MSRPC, основанный на DCE / RPC.
  • Распределенная вычислительная среда DCE / RPC Open Software Foundation (также реализованная Microsoft).
  • Пакет Google Protocol Buffers (protobufs) включает язык определения интерфейса, используемый для его протоколов RPC [12], исходный код которого был открыт в 2015 году как gRPC . [13]
  • WAMP объединяет RPC и публикацию-подписку в единый транспортно-независимый протокол.
  • Google Web Toolkit использует асинхронный RPC для связи с серверной службой. [14]
  • Apache Avro предоставляет RPC, где схемы обмена клиентом и сервером в квитировании соединения и генерации кода не требуются.
  • Встроенный RPC - это облегченная реализация RPC, разработанная NXP, нацеленная на основные ядра CortexM.
  • KF Trusted Execution Environment использует прокси и маршалинг объектов для передачи объектов в песочнице.
  • msgpack-rpc - это облегченная реализация RPC, использующая MessagePack для сериализации данных. Используется в текстовом редакторе Neovim .

См. Также [ править ]

  • 9P
  • Microsoft RPC
  • Вызов местной процедуры
  • HTTP
  • ODBC
  • Удаленная оценка
  • Представление внешних данных (формат сериализации, используемый, например, NFS)
  • Представление сетевых данных (формат сериализации, используемый, например, Microsoft RPC)
  • Ресурсо-ориентированная архитектура
  • ПО промежуточного слоя для распределенных объектов
  • Фрагментированный объект
  • gRPC

Ссылки [ править ]

  1. Брюс Джей Нельсон (май 1981 г.). Вызов удаленной процедуры . PARC CSL-81-9 (также CMU-CS-81-119) . Исследовательский центр Xerox в Пало-Альто. Кандидатская диссертация.
  2. ^ "Пер Бринч Хансен • Компьютерное общество IEEE" . www.computer.org . Проверено 15 декабря 2015 .
  3. ^ Бринч Хансен, Пер (1969). Компьютерное программное обеспечение RC 4000: система мультипрограммирования (PDF) . Копенгаген, Дания: Regnecentralen.
  4. Джеймс Э. Уайт (23 декабря 1975 г.). «Фреймворк высокого уровня для совместного использования сетевых ресурсов» . RFC 707 . Центр исследований аугментации . Проверено 11 июля 2011 года .
  5. ^ Бринч Хансен, Per (ноябрь 1978). «Распределенные процессы: концепция параллельного программирования» (PDF) . Коммуникации ACM . 21 (11): 934–941. CiteSeerX 10.1.1.107.3108 . DOI : 10.1145 / 359642.359651 .  
  6. ^ Браунбридж, Дэвид Р .; Маршалл, Линдси Ф .; Рэнделл, Брайан (1982). "Ньюкасл коннекшн" (PDF) . Программное обеспечение - практика и опыт . 12 (12): 1147–1162. DOI : 10.1002 / spe.4380121206 . Архивировано из оригинального (PDF) 16 августа 2016 года . Проверено 16 августа 2016 .
  7. ^ Биррелл, Эндрю Д.; Нельсон, Брюс Джей (1984). «Реализация удаленных вызовов процедур» (PDF) . ACM-транзакции в компьютерных системах . 2 : 39–59. DOI : 10.1145 / 2080.357392 .
  8. ^ a b "1994 - Эндрю Биррелл, Брюс Нельсон: Удаленный вызов процедуры" . Ссылка на награду Software System Award . Ассоциация вычислительной техники . Архивировано из оригинального 2 -го апреля 2012 года . Проверено 11 июля 2011 года .
  9. ^ "Премия Зала славы SIGOPS" . Специальная группа по операционным системам . Ассоциация вычислительной техники . Проверено 11 июля 2011 года .
  10. ^ AZ языков программирования: Modula-3 - az языков программирования. Архивировано 5 января 2009 г. на Wayback Machine . Компьютерный мир. Проверено 17 июля 2013.
  11. ^ libevent: Главная страница . Monkey.org. Проверено 17 июля 2013.
  12. ^ "Буферы протокола - формат обмена данными Google" . Сайт проекта Google . Проверено 1 ноября 2011 года .
  13. ^ "Универсальная среда RPC с открытым исходным кодом gRPC" . Сайт проекта Google . Проверено 7 сентября 2016 года .
  14. ^ "Google Web Toolkit" . Сайт проекта Google . Проверено 1 ноября 2011 года .

Внешние ссылки [ править ]

  • RFC 1057 - определяет версию 1 ONC RPC
  • RFC 5531 - определяет версию 2 ONC RPC
  • Удаленные вызовы процедур (RPC) - Учебное пособие по ONC RPC от доктора Дейва Маршалла из Кардиффского университета
  • Введение в программирование RPC - введение разработчика в RPC и XDR из документации SGI IRIX.