stringtranslate.com

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

В распределенных вычислениях удаленный вызов процедуры ( 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), используемый в качестве основы для сетевой файловой системы ( НФС).

В 1990-х годах, с ростом популярности объектно-ориентированного программирования , была широко реализована альтернативная модель удаленного вызова методов (RMI), например, в Common Object Request Broker Architecture (CORBA, 1991) и удаленном вызове методов Java. Популярность RMI, в свою очередь, упала с развитием Интернета, особенно в 2000-х годах.

Передача сообщений

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

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

Цепочка событий

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

Стандартные контактные механизмы

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

Аналоги

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

Языковой

Для конкретного приложения

Общий

Смотрите также

Рекомендации

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

Внешние ссылки