1 つのサーバーと多数のクライアント間でデータ要求/ファイル転送を行うために、Python でサポートされている優れたサーバー/クライアント プロトコルを探しています。セキュリティも問題です。そのため、安全なログインがプラスになります。私は XML-RPC を調べてきましたが、かなり古い (そしておそらく最近は使用されていない?) プロトコルのようです。
11 に答える
ファイル転送を行う場合、XMLRPC はおそらく適切ではありません。すべてのデータを XML としてエンコードする (そしてメモリにロードする) 必要があります。
「データ要求」と「ファイル転送」は、昔ながらの普通の HTTP のように聞こえますが、問題に関するあなたの声明では、要件が明確になりません。リクエストでどのような情報をエンコードする必要がありますか? 「 http://yourserver.example.com/service/request?color=yellow&flavor=banana 」のような URLで十分でしょうか?
Python には多数の HTTP クライアントとサーバーがあり、どれも特に優れたものではありませんが、基本的なファイル転送の仕事はすべてこなせると確信しています。HTTPS とパスワードを使用する「通常の」Web の方法でセキュリティを確保できますが、これでおそらく十分です。
双方向通信が必要な場合は、HTTP が適していないため、Twisted のパースペクティブ ブローカー (PB)や非同期メッセージング プロトコル (AMP)などのプロトコルの方が適している可能性があります。これらのプロトコルは、確かに Twisted によって十分にサポートされています。
ProtocolBuffersは、非常にコンパクトで効率的な方法でデータをシリアル化する方法として Google によってリリースされました。C++、Java、および Python をサポートしています。まだ使っていませんが、ソースを見ると言語ごとにRPCクライアントとサーバーがあるようです。
私は個人的にいくつかのプロジェクトで XML-RPC を使用してきましたが、常に期待どおりの結果をもたらしました。私は通常、C++、Java、および Python の間を行き来していました。私は Python で libxmlrpc を頻繁に使用します。なぜなら、覚えやすく、対話的に入力するのが簡単だからです。
PyAMF は主に Flash クライアントを使用した RPC 用ですが、コンパクトな RPC 形式でもあり、検討する価値があります。
両端に Python がある場合、Pyro (Python Remote Objects) に勝るものはないと思います。Pyro には、サービスがネットワークに利用可能であることを知らせる「ネーム サーバー」さえあります。クライアントはネーム サーバーを使用して、特定の瞬間にアクティブな場所に関係なく、必要なサービスを見つけます。これにより、無料の冗長性が得られ、ダウンタイムなしでサービスをあるマシンから別のマシンに移動できます。
セキュリティのために、SSH 経由でトンネリングするか、接続レベルで TLS または SSL を使用します。もちろん、これらのオプションはすべて基本的に同じですが、設定にさまざまな問題があるだけです。
1. XMLRPC 2. JSONRPC 3. SOAP 4. REST/ATOM XMLRPC は有効な選択肢です。古いので気にしないでください。それは問題ではない。非常にシンプルで、元の仕様から変更する必要はほとんどありません。長所は、私が知っているすべてのプログラミング言語には、クライアントを書き込むためのライブラリがあることです。確かにpython用です。mod_python で動作させましたが、まったく問題ありませんでした。それに関する大きな問題は、その冗長性です。単純な値の場合、多くの XML オーバーヘッドがあります。もちろん gzip できますが、そうすると Fiddler などのツールを使用したデバッグ機能が失われます。
私の個人的な好みは JSONRPC です。XMLRPC のすべての利点があり、非常にコンパクトです。さらに、Javascript クライアントはそれを「評価」できるため、解析は必要ありません。それらのほとんどは、標準のバージョン 1.0 用に構築されています。1.1、1.2、および 2.0 と呼ばれるさまざまな改善の試みを見てきましたが、それらは重ねて構築されておらず、私の知る限り、まだ広くサポートされていません。2.0 が一番良さそうですが、今のところ 1.0 を使い続けるつもりです (2008 年 10 月)。
3 番目の候補は REST/ATOM です。REST は原則であり、ATOM は、POST、PUT 要求、および GET 応答で必要なときに大量のデータを伝達する方法です。非常に優れた実装については、Google の API である GData を参照してください。ほんまほんまいい。
SOAP は古く、多くのライブラリや言語でサポートされています。IT は重くて複雑ですが、主なクライアントが .NET または Java である場合は、手間をかける価値があるかもしれません。Visual Studio は WSDL ファイルをインポートしてラッパーを作成します。C# プログラマーにとっては、実際にはローカル アセンブリのように見えます。
このすべての良い点は、ソリューションを正しく設計すれば、Python 用の既存のライブラリを使用して、ほとんどオーバーヘッドなしで複数をサポートできることです。XMLRPC と JSONRPC は特に相性が良いです。
認証について。XMLRPC と JSONRPC はわざわざ定義する必要はありません。連載から独立したものです。したがって、基本認証、ダイジェスト認証、またはそれらのいずれかを使用して独自に実装できます。Python のクライアント側ダイジェスト認証の例をいくつか見てきましたが、サーバー ベースのものはまだ見ていません。Apache を使用している場合は、代わりに mod_auth_digest Apache モジュールを使用する必要がない場合があります。これは、アプリケーションの性質によって異なります
輸送のセキュリティ。明らかにSSL(HTTPS)です。XMLRPC がどのように処理されるかは今のところ覚えていませんが、私が持っている JSONRPC 実装では簡単です。JSONRPC への URL で http を https に変更するだけで、SSL 対応のトランスポートを経由することになります。
HTTPは要件に合っているようで、Python で非常によくサポートされています。
Twistedは、Python での本格的な非同期ネットワーク プログラミングに適していますが、学習曲線が急であるため、システムが多くの同時実行を処理する必要があることがわかっていない限り、より単純なものを使用する価値があるかもしれません。
まずurllib
、クライアントにはWSGI サービスを使用し、サーバーには Apache の背後にあるものを使用することをお勧めします。Apache は、かなり簡単に HTTPS を処理するようにセットアップできます。
SSH は、特に安全なログインに関心がある場合は、ファイル転送とリモート コントロールに適しています。ほとんどの Linux および Solaris サーバーでは、管理用の SSH サービスが既に実行されているため、Python プログラムで ssh を使用している場合は、リモート マシンで追加のポートやサービスを開く必要はありません。
OpenSSHは、移植可能な標準の SSH クライアントおよびサーバーであり、Python のサブプロセス経由で使用できます。より柔軟性が必要な場合、Twisted にはTwisted Conchが含まれています。これは、Linux と Windows の両方で、SSH スタックの柔軟なプログラム制御を提供する SSH クライアントとサーバーの実装です。私は両方を本番環境で使用しています。
HTTP を使用する必要はありません (実際、HTTP はいくつかの点で一般的に RPC には適していません)。Python サーバーと通信する Python クライアントについて話している場合は、標準ベースのプロトコルを使用する必要はありません。
Pyro などの Python 固有の RPC ライブラリ、または Twisted が提供するもの (Twisted.spread) を使用します。
XMLRPCは非常に簡単に使い始めることができ、以前の仕事では、分散システムのノード内通信にXMLRPCを幅広く使用していました。Noneの値を簡単に転送できないという事実を追跡している限り、操作は非常に簡単で、Pythonの標準ライブラリに含まれています。
httpsで実行し、すべての呼び出しにユーザー名/パスワードパラメータを追加すると、簡単なセキュリティが設定されます。ただし、Pythonでサーバー証明書を検証するのがどれほど簡単かはわかりません。
ただし、大量のデータを転送する場合は、XMLへのコーディングがボトルネックになる可能性があるため、httpsを介してRESTに触発されたアーキテクチャを使用することはxmlrpclibと同じくらい良い場合があります。
Facebookの節約プロジェクトは良い答えかもしれません。軽量プロトコルを使用してオブジェクトを渡し、任意の言語を使用できるようにします。私は何もないと信じているので、それはセキュリティに落ちるかもしれません。
RPC 分野では、Json-RPC は xml-rpc よりもパフォーマンスが大幅に向上します: http://json-rpc.org/wiki/python-json-rpc