4

次のシナリオがあります。

必要なデータと、これらのデータが必要とするクライアント コンポーネントを含むサーバー。

サーバーには 2 種類のデータが保存されます。 - いくつかの情報 - 基本的にほんの数文字列 - バイナリ データ

バイナリ データの取得に問題があります。どちらもJava 5で書かれているので、いくつかの方法があります....

Web サービスは、速度、メモリなどの理由で最適なソリューションではありません...

それで、あなたは何を好みますか?

可能であれば、低レベルのソケット接続を見逃したい...

前もって感謝します

ヴィテック

4

8 に答える 8

5

大量のデータを処理する唯一の方法は、生のソケット アクセスを使用することだと思います。

他のほとんどの方法では、大きなファイルでメモリ不足の問題が発生します。

Java でのソケット処理は非常に単純であり、ファイル全体をメモリにロードすることなくデータをストリーミングできます (これは、独自のバッファリングなしで舞台裏で行われます)。

この戦略を使用して、メモリの問題にぶつかることなく、任意の大きなファイルを転送できるシステムを構築することができました (システムをテストするために 7 GB 以上の DVD イメージを使用していました)。

于 2009-01-02T01:52:29.587 に答える
5

SOAP サービスの一部としてバイナリ データを転送するための W3C 標準 MTOM を見てみましょう。バイナリとして送信し、バッファリングされたチャンクとしても送信できるという点で効率的です。また、他のクライアントまたはプロバイダーと相互運用します。

MTOM 相互運用の方法

サーバー側 - SOAP を使用した添付ファイルの送信

于 2009-01-02T03:34:48.927 に答える
2

protobufをご覧になることをお勧めします。これは、Google がデータ交換に使用するライブラリです。その非常に効率的で拡張可能です。余談ですが、1TB のハードディスクを満載したステーション ワゴンの帯域幅を決して過小評価しないでください。

于 2009-01-02T01:33:36.707 に答える
1

バイナリ データを Base64 に変換してから、SOAP 呼び出しを介して送信しようとしましたが、うまくいきました。それが Web サービスとしてカウントされるかどうかはわかりませんが、そうであるとすれば、ソケットにかなり悩まされていることになります。

于 2009-01-02T01:26:08.453 に答える
1

いくつかのオプション:

  • ソケットレベルのものを隠すRMIを使用することもできますし、おそらくデータをgzipすることもできます...しかし、接続が失敗した場合、接続は再開されません。おそらくメモリの問題も発生します。

  • バイナリ MIME タイプを使用してデータを HTTP で送信するだけです (Web サーバーで gzip を構成することもできます)。履歴書で同様の問題。

  • wgetのようなものを生成します(これで再開できると思います)

  • クライアントがすでにデータ (以前のバージョン) を持っている場合、rsync は変更のみをコピーします。

于 2009-01-02T01:39:25.760 に答える
0

古い手頃な価格の堅牢な FTP はどうですか? たとえば、FTP サーバーをサーバー側のコンポーネントに簡単に組み込み、FTP クライアントをコーディングすることができます。FTP はまさにそのために生まれました (File Transfer Protocol ですよね?) が、添付ファイル付きの SOAP はそのようなことを念頭に置いて設計されておらず、パフォーマンスが非常に悪い場合があります。たとえば、以下をご覧ください。

http://mina.apache.org/ftpserver/

しかし、他にも実装はあります。Apache Mina は、私が覚えている最初の実装です。

幸運を祈ります

于 2009-01-02T01:49:45.380 に答える
0

スニーカーネットはオプションですか?:P

RMI は、使いやすさとメモリ リークの問題でよく知られています。注意してください。話しているデータの量にもよりますが、スニーカーネットとソケットはどちらも良い選択肢です。

于 2009-01-02T01:55:20.813 に答える
0

トランスポート層としてGridFTPを検討してください。この質問も参照してください。

于 2009-01-02T02:27:31.327 に答える