Механизм, позволяющий программному обеспечению выполнять удаленную процедуру
В распределенных вычислениях удаленный вызов процедуры ( 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.
Важное различие между удаленными вызовами процедур и локальными вызовами заключается в том, что удаленные вызовы могут давать сбои из-за непредсказуемых сетевых проблем. Кроме того, вызывающие обычно должны иметь дело с такими сбоями, не зная, была ли удаленная процедура действительно вызвана. Идемпотентные процедуры (те, которые не имеют дополнительных эффектов при повторном вызове) легко обрабатываются, но остается достаточно трудностей, из-за которых код для вызова удаленных процедур часто ограничивается тщательно написанными низкоуровневыми подсистемами.
Последовательность событий
- Клиент вызывает клиентскую заглушку. Вызов является локальным вызовом процедуры, параметры которой помещаются в стек обычным способом.
- Клиентская заглушка упаковывает параметры в сообщение и делает системный вызов для отправки сообщения. Упаковка параметров называется маршаллингом.
- Локальная операционная система клиента отправляет сообщение с клиентского компьютера на серверный компьютер.
- Локальная операционная система на серверной машине передает входящие пакеты на серверную заглушку.
- Серверная заглушка распаковывает параметры из сообщения. Распаковка параметров называется демаршаллингом.
- Наконец, серверная заглушка вызывает серверную процедуру. Ответ отслеживает те же шаги в обратном направлении.
Стандартные контактные механизмы
Чтобы позволить разным клиентам получать доступ к серверам, было создано несколько стандартизированных систем RPC. Большинство из них используют язык описания интерфейса (IDL), чтобы позволить различным платформам вызывать RPC. Файлы IDL затем могут использоваться для генерации кода для взаимодействия между клиентом и серверами.
Аналоги
Известные реализации RPC и аналоги включают в себя:
Языко-специфический
- API Java Remote Method Invocation (Java RMI) обеспечивает функциональность, аналогичную стандартным методам RPC Unix.
- Go предоставляет пакет rpc для реализации RPC с поддержкой асинхронных вызовов.
- Сетевые объекты Modula-3, которые легли в основу RMI Java [10]
- RPyC реализует механизмы RPC на Python с поддержкой асинхронных вызовов.
- Distributed Ruby (DRb) позволяет программам Ruby взаимодействовать друг с другом на одной машине или по сети. DRb использует удаленный вызов методов (RMI) для передачи команд и данных между процессами.
- Erlang ориентирован на процессы и изначально поддерживает распределение и RPC посредством передачи сообщений между узлами и локальными процессами.
- Elixir создан на основе виртуальной машины Erlang и позволяет осуществлять взаимодействие процессов (процессов Elixir/Erlang, а не процессов ОС) в одной и той же сети «из коробки» посредством агентов и передачи сообщений.
- Фреймворк Tarpc Rust RPC от Google позволяет разработчикам определять структуру сообщений с помощью структур и трейтов Rust, а не с помощью protobuf. [11]
Специфическое приложение
- Формат сообщений действий (AMF) позволяет приложениям Adobe Flex взаимодействовать с бэкэндами или другими приложениями, поддерживающими AMF.
- Remote Function Call — стандартный интерфейс 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-вызовов.
- Распределенная вычислительная платформа Internet Communications Engine (Ice) компании ZeroC .
- Фреймворк 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 и Publish-Subscribe в единый транспортно-независимый протокол.
- Google Web Toolkit использует асинхронный RPC для связи с серверной службой. [15]
- Apache Avro обеспечивает RPC, при котором клиент и сервер не обязаны обмениваться схемами при установлении соединения и генерации кода.
Смотрите также
Ссылки
- ^ Брюс Джей Нельсон (май 1981 г.). Удаленный вызов процедур (диссертация на соискание степени доктора философии). Исследовательский центр Xerox в Пало-Альто. PARC CSL-81-9 (также CMU-CS-81-119).
- ^ "Пер Бринч Хансен • Компьютерное общество IEEE" . www.computer.org . Проверено 15 декабря 2015 г.
- ^ Бринч Хансен, Пер (1969). Компьютерное программное обеспечение RC 4000: система мультипрограммирования (PDF) . Копенгаген, Дания: Regnecentralen.
- ^ Джеймс Э. Уайт (23 декабря 1975 г.). «Высокоуровневая структура для сетевого распределения ресурсов». RFC 707 . Исследовательский центр дополнений . doi : 10.17487/RFC0707 . Получено 11 июля 2011 г. .
- ^ 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.
- ^ Браунбридж, Дэвид Р.; Маршалл, Линдси Ф.; Рэнделл, Брайан (1982). "The Newcastle Connection" (PDF) . Программное обеспечение: практика и опыт . 12 (12): 1147–1162. doi :10.1002/spe.4380121206. S2CID 1840438. Архивировано из оригинала (PDF) 2016-08-16 . Получено 2016-08-16 .
- ^ Биррелл, Эндрю Д.; Нельсон, Брюс Джей (1984). «Реализация удаленных вызовов процедур» (PDF) . ACM Transactions on Computer Systems . 2 : 39–59. doi :10.1145/2080.357392. S2CID 11525846.
- ^ ab "1994 – Andrew Birrell, Bruce Nelson: Remote Procedure Call". Цитата премии Software System Award . Association for Computing Machinery . Архивировано из оригинала 2 апреля 2012 г. Получено 11 июля 2011 г.
- ^ "SIGOPS Hall of Fame Award". Специальная группа по операционным системам . Ассоциация вычислительной техники . Получено 11 июля 2011 г.
- ^ Языки программирования от А до Я: Modula-3 — языки программирования от А до Я. Архивировано 05.01.2009 на Wayback Machine . Computerworld. Получено 17.07.2013.
- ^ tarpc, Google, 2023-11-02 , получено 2023-11-02
- ^ libevent: Главная страница. Monkey.org. Получено 17 июля 2013 г.
- ^ "Protocol Buffers - формат обмена данными Google". Веб-сайт проекта Google . Получено 1 ноября 2011 г.
- ^ "gRPC open-source universal RPC framework". Сайт проекта Google . Получено 7 сентября 2016 г.
- ^ "Google Web Toolkit". Веб-сайт проекта 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.