Лучший поддерживаемый Python сервер / клиентский протокол? - PullRequest
9 голосов
/ 15 сентября 2008

Я ищу хороший протокол сервера / клиента, поддерживаемый в Python для выполнения запросов данных / передачи файлов между одним сервером и многими клиентами. Безопасность также является проблемой - так что безопасный вход будет плюсом. Я изучал XML-RPC, но он выглядит довольно старым (и, возможно, не используемым в наши дни?) Протоколом.

Ответы [ 11 ]

9 голосов
/ 17 сентября 2008

Если вы хотите передавать файлы, XMLRPC, скорее всего, плохой выбор. Это потребует, чтобы вы закодировали все свои данные в виде XML (и загрузили их в память).

«Запросы данных» и «передача файлов» для меня звучат очень похоже на старый добрый HTTP, но ваше изложение проблемы не проясняет ваши требования. Какую информацию необходимо кодировать в запросе? Будет ли такой URL, как "http://yourserver.example.com/service/request?color=yellow&flavor=banana", достаточно хорошим?

В Python много HTTP-клиентов и серверов, но ни один из них не особенно хорош, но я уверен, что все они помогут выполнить основные операции по передаче файлов. Вы можете обеспечить безопасность «обычным» веб-способом, который заключается в использовании HTTPS и паролей, которых, вероятно, будет достаточно.

Если вам нужна двусторонняя связь, то HTTP падает, и протокол, подобный брокеру перспективы (PB) Twisted или протокол асинхронной передачи сообщений (AMP) , может подойти вам лучше. Эти протоколы, безусловно, хорошо поддерживаются Twisted.

7 голосов
/ 15 ноября 2008

ProtocolBuffers был выпущен Google как способ сериализации данных очень компактным и эффективным способом. У них есть поддержка C ++, Java и Python. Я еще не использовал его, но, глядя на источник, кажется, что для каждого языка есть RPC-клиенты и серверы.

Я лично использовал XML-RPC в нескольких проектах, и он всегда делал именно то, на что я надеялся. Я обычно ходил между C ++, Java и Python. Я часто использую libxmlrpc в Python, потому что он легко запоминается и печатается в интерактивном режиме, но на самом деле он намного медленнее, чем альтернативный pyxmlrpc .

PyAMF в основном предназначен для RPC с Flash-клиентами, но это компактный формат RPC, на который стоит обратить внимание.

Когда у вас есть Python на обоих концах, я не думаю, что что-то превосходит Pyro (удаленные объекты Python). В Pyro даже есть «сервер имен», который позволяет сервисам объявлять о своей доступности для сети. Клиенты используют сервер имен, чтобы найти нужные им сервисы, независимо от того, где они активны в данный момент. Это дает вам бесплатное резервирование и возможность перемещать сервисы с одного компьютера на другой без простоев.

В целях безопасности я бы туннелировал через SSH или использовал TLS или SSL на уровне соединения. Конечно, все эти параметры, по сути, одинаковы, они просто имеют различные трудности настройки.

5 голосов
/ 15 сентября 2008

Pyro (удаленные объекты Python) довольно умен, если все ваши серверы / клиенты будут в Python. Я часто использую XMPP , так как я общаюсь с хостами, которые не всегда являются Python. XMPP также легко расширяется.

Существует отличная библиотека XMPP для python, которая называется PyXMPP , которая достаточно актуальна и не зависит от Twisted.

4 голосов
/ 02 ноября 2008

Я предлагаю вам взглянуть на 1. XMLRPC 2. JSONRPC 3. SOAP 4. REST / ATOM XMLRPC - правильный выбор. Не волнуйся, это слишком старо. Это не проблема. Это так просто, что мало что нужно изменить, так как оригинальная спецификация. Преимущество в том, что в каждом языке программирования, который я знаю, есть библиотека для клиента, в которую можно писать. Конечно, для python. Я заставил его работать с mod_python и у меня не было никаких проблем. Большая проблема с этим - его многословие. Для простых значений существует много накладных расходов на XML. Вы можете получить его из причины, но затем вы потеряете некоторые возможности отладки с помощью таких инструментов, как Fiddler.

Мои личные предпочтения - JSONRPC. Он обладает всеми преимуществами XMLRPC и очень компактен. Кроме того, клиенты Javascript могут «оценить» его, поэтому анализ не требуется. Большинство из них построены для версии 1.0 стандарта. Я видел различные попытки улучшить его, названный 1.1 1.2 и 2.0, но они не построены один на другом и, насколько мне известно, пока не получили широкой поддержки. 2.0 выглядит лучше, но я все еще придерживался бы 1.0 (октябрь 2008)

Третьим кандидатом будет REST / ATOM. REST - это принцип, а ATOM - это способ передачи большого объема данных, когда это необходимо для запросов POST, PUT и GET. Для очень хорошей реализации этого взгляните на GData, API Google. Очень хорошо.

SOAP устарел, и многие библиотеки / языки поддерживают его. Это тяжело и сложно, но если ваши основные клиенты .NET или Java, это может стоить беспокойства. Visual Studio импортирует ваш файл WSDL и создаст оболочку, а для программиста C # это будет выглядеть как локальная сборка.

Приятная вещь во всем этом заключается в том, что если вы правильно разработаете свое решение, существующие библиотеки для Python позволят вам поддерживать более одной библиотеки практически без затрат. XMLRPC и JSONRPC особенно хорошо подходят.

Относительно аутентификации. XMLRPC и JSONRPC не утруждают себя определением. Это независимая вещь от сериализации. Таким образом, вы можете реализовать базовую аутентификацию, дайджест-аутентификацию или свою собственную с любым из них. Я видел пару примеров дайджест-аутентификации на стороне клиента для python, но мне еще предстоит увидеть серверную. Если вы используете Apache, он может вам не понадобиться, вместо этого используется модуль Apache mod_auth_digest. Это зависит от характера вашего приложения

Транспортная безопасность. Это явно SSL (HTTPS). В настоящее время я не могу вспомнить, как работает XMLRPC, но с имеющейся у меня реализацией JSONRPC это тривиально - вы просто меняете http на https в своих URL-адресах на JSONRPC, и он будет проходить через транспорт с поддержкой SSL.

3 голосов
/ 15 сентября 2008

HTTP , кажется, соответствует вашим требованиям и очень хорошо поддерживается в Python.

Twisted подходит для серьезного асинхронного сетевого программирования в Python, но имеет крутой график обучения, поэтому может быть целесообразно использовать что-то более простое, если вы не знаете, что вашей системе потребуется много параллелизма.

Для начала я бы предложил использовать urllib для клиента и службу WSGI за Apache для сервера. Apache можно настроить для работы с HTTPS довольно просто.

2 голосов
/ 03 ноября 2008

SSH может быть хорошим выбором для передачи файлов и удаленного управления, особенно если вы заинтересованы в безопасном входе в систему. Большинство серверов Linux и Solaris уже используют службу SSH для администрирования, поэтому, если ваша программа на Python использует ssh, вам не нужно открывать дополнительные порты или службы на удаленных машинах.

OpenSSH - это стандартный и переносимый клиент и сервер SSH, который можно использовать через подпроцессы из Python. Если вам нужна большая гибкость, Twisted включает Twisted Conch , который представляет собой реализацию клиента и сервера SSH, которая обеспечивает гибкое программируемое управление стеком SSH как в Linux, так и в Windows. Я использую оба в производстве.

1 голос
/ 02 ноября 2008

Нет необходимости использовать HTTP (действительно, HTTP в некоторых отношениях не годится для RPC вообще), и нет необходимости использовать стандартный протокол, если вы говорите о клиенте python, говорящем с сервером python .

Используйте специфичную для Python RPC-библиотеку, такую ​​как Pyro, или предоставляемую Twisted (Twisted.spread).

1 голос
/ 15 сентября 2008

Я бы использовал http и начал с понимания того, что предлагает библиотека Python .

Тогда я перейду к более индустриальной силе Витая библиотека.

0 голосов
/ 11 ноября 2008

Проект Facebook может быть хорошим ответом. Он использует легкий протокол для передачи объекта и позволяет использовать любой язык, который вы пожелаете. Это может повлиять на безопасность, хотя, как я полагаю, ее нет.

0 голосов
/ 15 сентября 2008

С XMLRPC очень просто начать работу, и на моей предыдущей работе мы широко использовали его для внутриузловой связи в распределенной системе. Пока вы отслеживаете тот факт, что значение None не может быть легко передано, с ним очень легко работать, и оно включено в стандартную библиотеку Python.

Запустите его через https и добавьте параметр имени пользователя / пароля для всех вызовов, и у вас будет простая защита. Не уверен, насколько просто проверить сертификат сервера в Python.

Однако, если вы передаете большие объемы данных, кодирование в XML может стать узким местом, поэтому использование архитектуры, вдохновленной REST через https, может быть таким же хорошим, как и xmlrpclib.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...