В распределенных вычислениях, удаленная процедура Вызов (RPC ) - это когда компьютерная программа вызывает выполнение процедуры (подпрограммы ) в другом адресном пространстве (обычно на другом компьютере в общей сети), что кодируется так, как если бы это был обычный (локальный) вызов процедуры, без явного кодирования программистом деталей для удаленного взаимодействия. То есть программист пишет по существу один и тот же код независимо от того, является ли подпрограмма локальной по отношению к исполняемой программе или удаленной. Это форма взаимодействия клиент-сервер (вызывающий - клиент, исполнитель - сервер), обычно реализуемая через систему передачи сообщений типа запрос-ответ. В парадигме объектно-ориентированного программирования RPC представлены удаленным вызовом метода (RMI). Модель RPC подразумевает уровень прозрачности местоположения, а именно, что процедуры вызова в основном одинаковы, независимо от того, являются ли они локальными или удаленными, но обычно они не идентичны, поэтому локальные вызовы можно отличить от удаленных вызовов. Удаленные вызовы обычно на несколько порядков медленнее и менее надежны, чем местные вызовы, поэтому важно их различать.
RPC - это форма межпроцессного взаимодействия (IPC), в которой разные процессы имеют разные адресные пространства: если они находятся на одной и той же главной машине, они имеют разные виртуальные адресные пространства, даже если физическое адресное пространство является тем же; тогда как если они находятся на разных хостах, физическое адресное пространство другое. Для реализации этой концепции использовалось множество различных (часто несовместимых) технологий.
Протоколы запроса-ответа относятся к ранним распределенным вычислениям в конце 1960-х, теоретические предложения удаленных вызовов процедур в качестве модели сетевых операций относится к 1970-м годам, а практическая реализация относится к началу 1980-х. Брюсу Джею Нельсону обычно приписывают создание термина «удаленный вызов процедуры» в 1981 году.
Удаленные вызовы процедур, используемые в современных операционных системах, восходят к мультипрограммированию RC 4000 система, которая использовала протокол связи запрос-ответ для синхронизации процессов. Идея обработки сетевых операций как вызовов удаленных процедур восходит, по крайней мере, к 1970-м годам в ранних документах ARPANET. В 1978 г. Пер Бринч Хансен предложил распределенные процессы, язык для распределенных вычислений, основанный на «внешних запросах», состоящих из вызовов процедур между процессами.
Одна из первых практических реализаций была реализована в 1982 г. Брайан Рэнделл и его коллеги за их Newcastle Connection между машинами UNIX. Вскоре за ним последовали «Люпин» Эндрю Биррелла и Брюса Нельсона в среде Cedar в Xerox PARC. Люпин автоматически генерировал заглушки, обеспечивая безопасные для типов привязки и использовал эффективный протокол для связи. Одним из первых коммерческих применений RPC был Xerox под названием «Courier» в 1981 году. Первой популярной реализацией RPC в Unix была Sun RPC ( теперь называется ONC RPC), который используется в качестве основы для сетевой файловой системы (NFS).
В 1990-е годы, когда популярно объектно-ориентированное программирование, широко применялась альтернативная модель удаленного вызова методов (RMI), например, в Common Object Request Broker Architecture (CORBA, 1991) и вызов удаленного метода Java. Популярность RMI, в свою очередь, упала с появлением Интернета, особенно в 2000-х годах.
RPC - это протокол запрос – ответ. RPC инициируется клиентом, который отправляет известному удаленному серверу сообщение запроса для выполнения указанной процедуры с предоставленными параметрами. Удаленный сервер отправляет ответ клиенту, и приложение продолжает свой процесс. Пока сервер обрабатывает вызов, клиент блокируется (он ждет, пока сервер завершит обработку, прежде чем возобновить выполнение), если только клиент не отправит серверу асинхронный запрос, например XMLHttpRequest. Существует множество вариаций и тонкостей в различных реализациях, что приводит к множеству различных (несовместимых) протоколов RPC.
Важное различие между удаленными вызовами процедур и локальными вызовами состоит в том, что удаленные вызовы могут завершиться ошибкой из-за непредсказуемых сетевых проблем. Кроме того, вызывающие обычно должны иметь дело с такими сбоями, не зная, действительно ли была вызвана удаленная процедура. Идемпотентные процедуры (те, которые не имеют дополнительных эффектов при вызове более одного раза) легко обрабатываются, но остается достаточно трудностей, чтобы код для вызова удаленных процедур часто ограничивался тщательно написанными низкоуровневыми подсистемами.
Чтобы позволить различным клиентам обращаться к серверам, был создан ряд стандартизированных систем RPC. Большинство из них используют язык описания интерфейса (IDL), чтобы позволить различным платформам вызывать RPC. Затем файлы IDL можно использовать для генерации кода для взаимодействия между клиентом и серверами.
Известные реализации и аналоги RPC включают: