stringtranslate.com

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

В распределенных вычислениях удаленный вызов процедуры ( 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] За ней вскоре последовал «Lupine» Эндрю Биррелла и Брюса Нельсона в среде Cedar в Xerox PARC . [7] [8] [9] Lupine автоматически генерировал заглушки, обеспечивая типобезопасные привязки, и использовал эффективный протокол для связи. [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.

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

Последовательность событий

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

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

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

Аналоги

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

Языко-специфический

Специфическое приложение

Общий

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

Ссылки

  1. ^ Брюс Джей Нельсон (май 1981 г.). Удаленный вызов процедур (диссертация на соискание степени доктора философии). Исследовательский центр Xerox в Пало-Альто. PARC CSL-81-9 (также CMU-CS-81-119).
  2. ^ "Пер Бринч Хансен • Компьютерное общество IEEE" . www.computer.org . Проверено 15 декабря 2015 г.
  3. ^ Бринч Хансен, Пер (1969). Компьютерное программное обеспечение RC 4000: система мультипрограммирования (PDF) . Копенгаген, Дания: Regnecentralen.
  4. ^ Джеймс Э. Уайт (23 декабря 1975 г.). «Высокоуровневая структура для сетевого распределения ресурсов». RFC 707 . Исследовательский центр дополнений . doi : 10.17487/RFC0707 . Получено 11 июля 2011 г. .
  5. ^ Brinch Hansen, Per (ноябрь 1978 г.). "Распределенные процессы: концепция параллельного программирования" (PDF) . Communications of the ACM . 21 (11): 934–941. CiteSeerX 10.1.1.107.3108 . doi :10.1145/359642.359651. S2CID  11610744. 
  6. ^ Браунбридж, Дэвид Р.; Маршалл, Линдси Ф.; Рэнделл, Брайан (1982). "The Newcastle Connection" (PDF) . Программное обеспечение: практика и опыт . 12 (12): 1147–1162. doi :10.1002/spe.4380121206. S2CID  1840438. Архивировано из оригинала (PDF) 2016-08-16 . Получено 2016-08-16 .
  7. ^ Биррелл, Эндрю Д.; Нельсон, Брюс Джей (1984). «Реализация удаленных вызовов процедур» (PDF) . ACM Transactions on Computer Systems . 2 : 39–59. doi :10.1145/2080.357392. S2CID  11525846.
  8. ^ ab "1994 – Andrew Birrell, Bruce Nelson: Remote Procedure Call". Цитата премии Software System Award . Association for Computing Machinery . Архивировано из оригинала 2 апреля 2012 г. Получено 11 июля 2011 г.
  9. ^ "SIGOPS Hall of Fame Award". Специальная группа по операционным системам . Ассоциация вычислительной техники . Получено 11 июля 2011 г.
  10. ^ Языки программирования от А до Я: Modula-3 — языки программирования от А до Я. Архивировано 05.01.2009 на Wayback Machine . Computerworld. Получено 17.07.2013.
  11. ^ tarpc, Google, 2023-11-02 , получено 2023-11-02
  12. ^ libevent: Главная страница. Monkey.org. Получено 17 июля 2013 г.
  13. ^ "Protocol Buffers - формат обмена данными Google". Веб-сайт проекта Google . Получено 1 ноября 2011 г.
  14. ^ "gRPC open-source universal RPC framework". Сайт проекта Google . Получено 7 сентября 2016 г.
  15. ^ "Google Web Toolkit". Веб-сайт проекта Google . Получено 1 ноября 2011 г.

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