Изменение роли клиент / сервер с помощью SimpleXMLRPCServer в Python
Я работаю над проектом по предоставлению на сервер набора методов с разных клиентских машин для сбора и автоматизации информации. В настоящее время я использую Python, и SimpleXMLRPCServer, кажется, отлично работает в локальной сети, где я знаю адреса клиентских машин, и нет NAT или брандмауэра.
Проблема в том, что модель клиент / сервер обратна тому, что я хочу сделать. Вместо того чтобы RPC-сервер работал на клиентском компьютере и предоставлял сервис программному клиенту, я бы хотел, чтобы сервер прослушивал соединения от клиентов, которые подключают и предоставляют сервис серверу.
Я думал о туннелировании, удаленной переадресации портов с использованием SSH или VPN, но эти варианты не очень хорошо масштабируются и создают больше издержек и сложности, чем хотелось бы.
Я думаю, что мог бы написать сервер и клиент, чтобы изменить модель, но я не хочу изобретать велосипед, если он уже существует. Мне кажется, что это будет достаточно распространенная проблема, и решение уже будет найдено.
Я также просто режу зубы на Python и сетевых сервисах, так что возможно я задаю не тот вопрос полностью.
2 ответа
То, что вы хотите, это, вероятно, маршрутизированный RPC WAMP. Кажется, это решает вашу проблему, и это очень удобно, когда вы привыкнете к ней
Идея состоит в том, чтобы поместить маршрутизатор WAMP (скажем) в облако, и вызывающий RPC и вызываемый RPC являются клиентами с исходящими подключениями к маршрутизатору.
Я также использовал VPN для соединения устройств IoT через Интернет, но переключение на эту модель маршрутизатора действительно упростило ситуацию, и оно довольно хорошо масштабируется.
Кстати WAMP реализован на разных языках, включая Python.
Может быть, Pyro может быть полезен? Это позволяет для многих форм распределенных вычислений в Python. Вы не очень четко понимаете свои требования, поэтому трудно сказать, сработает ли это для вас, но я советую вам взглянуть на документацию или на множество примеров Pyro и посмотреть, есть ли что-то, что соответствует вашему желанию.,
Pyro абстрагирует большинство сетевых сложностей, вы просто вызываете метод (удаленного) объекта python.