Что такое Remote Procedure Call (RPC) и как он работает

Ответ

Remote Procedure Call (RPC) — это протокол, который позволяет программе вызывать процедуру (функцию или метод) на другом компьютере в сети так, как будто она является локальной. RPC скрывает сложность сетевого взаимодействия, позволяя разработчикам сосредоточиться на бизнес-логике.

Как это работает (упрощенно):

  1. Клиент вызывает локальную функцию-заглушку (client stub).
  2. Заглушка упаковывает (сериализует) параметры вызова в сообщение и отправляет его по сети на сервер.
  3. Сервер получает сообщение, распаковывает его и передаёт параметры реальной процедуре.
  4. Процедура на сервере выполняется и возвращает результат.
  5. Сервер упаковывает результат и отправляет его обратно клиенту.
  6. Клиентская заглушка получает ответ, распаковывает его и возвращает результат вызывающей программе.

Пример с xmlrpc в Python:

Это простая реализация RPC, использующая XML для передачи данных.

Сервер:

from xmlrpc.server import SimpleXMLRPCServer

# Функция, которая будет вызываться удаленно
def add(x, y):
    return x + y

# Создаем сервер на localhost, порт 8000
server = SimpleXMLRPCServer(("localhost", 8000))
print("Listening on port 8000...")

# Регистрируем функцию под именем 'add'
server.register_function(add, "add")

# Запускаем сервер
server.serve_forever()

Клиент:

import xmlrpc.client

# Подключаемся к удаленному серверу
with xmlrpc.client.ServerProxy("http://localhost:8000/") as proxy:
    # Вызываем удаленную функцию 'add' как локальную
    result = proxy.add(5, 7)
    print(f"5 + 7 = {result}") # Вывод: 5 + 7 = 12

Современные и более производительные реализации RPC включают gRPC (от Google) и Apache Thrift, которые часто используются в микросервисных архитектурах.

Ответ 18+ 🔞

А, слушай, смотри, это ж про RPC! Ну, типа, такая штука, чтобы твоя программа могла позвать функцию, которая сидит на другом компе за тридевять земель, как будто она тут, под боком, в соседнем файле. Всю эту сетевую ебучую магию — сериализацию, сокеты, протоколы — она от тебя прячет, как мамаша прячет от ребёнка бутылку. Ты просто вызываешь функцию и получаешь результат, а под капотом там, блядь, целый ёперный театр разворачивается.

Как оно, сука, крутится (если по-простому):

  1. Ты, как клиент, вызываешь какую-нибудь заглушку — функцию-пустышку, которая выглядит как настоящая.
  2. Эта заглушка берёт твои аргументы, пакует их в какой-нибудь формат (XML, JSON, бинарный — да похуй) и шлёт по сети на сервер, будто почтового голубя.
  3. Сервер получает эту посылку, распаковывает, смотрит: «А, бля, надо функцию add запустить!» — и запускает уже настоящую, рабочую процедуру.
  4. Та процедура на сервере отрабатывает, получает результат и отдаёт его обратно в сетевое нутро.
  5. Сервер снова пакует результат и отправляет обратно клиенту, мол, держи, мудила, что просил.
  6. Твоя клиентская заглушка ловит ответ, распаковывает и подсовывает результат тебе прямо в переменную. И ты сидишь довольный, как будто всё локально и произошло. Хитрая жопа, да?

Вот, смотри, пример на xmlrpc в Python:

Старая, добрая, немного тормознутая штука, которая XML использует. Но для понимания — в самый раз, пиздопроебибна.

Сервер (тот, кто услуги оказывает):

from xmlrpc.server import SimpleXMLRPCServer

# Функция, которую будем вызывать удалённо. Обычное сложение, ничего особенного.
def add(x, y):
    return x + y

# Поднимаем сервак на localhost, порт 8000. Сидит, ждёт.
server = SimpleXMLRPCServer(("localhost", 8000))
print("Listening on port 8000...")

# Регистрируем нашу функцию под именем 'add'. Теперь её можно вызывать по имени.
server.register_function(add, "add")

# И понеслась! Сервер в бесконечном цикле.
server.serve_forever()

Клиент (тот, кто просит):

import xmlrpc.client

# Цепляемся к серверу по адресу.
with xmlrpc.client.ServerProxy("http://localhost:8000/") as proxy:
    # И вот тут магия! Вызываем 'add' так, будто она тут. А она там, блядь!
    result = proxy.add(5, 7)
    print(f"5 + 7 = {result}") # Вывод: 5 + 7 = 12

Ну а в серьёзных, боевых проектах сейчас используют gRPC (от Гугла, быстрый, бинарный) или Apache Thrift. Это уже для больших, распределённых систем, где микросервисы друг другу мозги выносят. Но принцип, ёпта, один — обманка для программиста, чтобы ему жизнь мёдом не казалась, а казалась простой.