ストリーミングの大きなファイルは、javaサーブレット

StackOverflow https://stackoverflow.com/questions/55709

  •  09-06-2019
  •  | 
  •  

質問

私はビルには、javaサーバが必要です。一つのサーブレットとする画像保存されAmazon S3.

最近では荷重下における私の記憶は私のVMでたった後、追加のコードの画像できだと思うのだストリーミングがサーブレット対応が起こっ不要です。

私の質問はあのベストプラクティスの方へのコードは、javaサーブレットをストリームに大きな(>200k)に対する回答のブラウザの場合から読み取りデータベースやその他のクラウドストレージ?

私とファイルに地元の温度やその後産卵に別のスレッドのストリーミングで、tomcatサーブレットのスレッドで再配布することができます。.このようなことio。

意思によりお願い申し上げます。感謝。

役に立ちましたか?

解決

可能な場合は、店内の全コンテンツのファイルでお召し上がりいただきます。代わりに、叉InputStreamのデータをコピーするデータをサーブレットOutputStream。例えば:

ServletOutputStream out = response.getOutputStream();
InputStream in = [ code to get source input stream ];
String mimeType = [ code to get mimetype of data to be served ];
byte[] bytes = new byte[FILEBUFFERSIZE];
int bytesRead;

response.setContentType(mimeType);

while ((bytesRead = in.read(bytes)) != -1) {
    out.write(bytes, 0, bytesRead);
}

// do the following in a finally block:
in.close();
out.close();

いいtobyるべきではなく"点、S3ます。"

としてのOOM例外がありました力を持っている画像データはもらえますか?せるJVMは256MBの"追加"メモリ使用いただける画像データです。Google、"256MB/200KB"=1310.2gバイトの"追加"メモリ(これらの日はとってもリーズナブルな金額が10,000万人を同時にお客様がサポートできます。もので、1300同時にお客様もかわいらしい。このタイプの負荷を経験しました?そうでない場合は、必要がある。るこOOMます。

編集に関して:

この使用の場合、画像を含むことができ敏感なタ---

それを読み直してみるとき、S3文書数週間前、い形を生成することができます時間-消滅キーにも取り付けることができるS3Urlに対するものとなります。いしいグローバルにオープンファイルS3ます。私の理解の技術は:

  1. 初期のHTMLページをダウンロードへのリンクをおwebapp
  2. ユーザーがクリックでダウンロードできるリンク
  3. おwebappの発生S3URLが含まれるキーが満了するに、きめ細か5分です。
  4. 送信するHTTPリダイレクトのクライアントへのURLからステップ3.
  5. ユーザのダウンロードファイルからS3.この作品の場合でもダウンロードより5分-一度にダウンロード開始まで続きます。

他のヒント

なぜならばっているS3すをァースからS3およびそのストリーミングを通じてご自分のサーバーの私の敗戦の利用目的S3、日陰の帯域幅および処理の画像をAmazon.

見ているが多くのコードのようにジョン-vasilef(現可)回答は、狭いながらループ読みのチャンクからストリームを書き込むことその他のストリームです。

引数のいくのに対してもコードの重複は、利用ApacheのIOUtils.を既に利用中のお客さまかな場合、または他の図書館またはフレームワークだがりで、シングルラインでも実験しました。

以下のコードでは、私はストリーミングオブジェクトからAmazon S3クライアントには、servlet.

import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.io.IOUtils;

InputStream in = null;
OutputStream out = null;

try {
    in = object.getObjectContent();
    out = response.getOutputStream();
    IOUtils.copy(in, out);
} finally {
    IOUtils.closeQuietly(in);
    IOUtils.closeQuietly(out);
}

6ラインをよく規定されたパターンを適切なストリームの終わかる。

同意する強力両tobyジョンVasileff--S3がoffの負荷に大きなメディアオブジェクトまで許容し、関連する課題です。(インスタンスのアプリケーションはあなたの10 1000MB FLVsとMP4s.) E.g.:ない部分をご希望のバイト範囲のヘッダー)です。一つは、対応する')を抽出し、ダウン時間、など。

ない場合には、オプションで、ジョンコードなんじゃないでしょうか。このbyteバッファの2k FILEBUFFERSIZEは、最も効率的にmicrobench。別のオプションが共通のFileChannel.(FileChannelsはスレッドセーフです。)

と思いつまでも推測でどのようなメモリ不足エラーは、クラシックの最適化。だ改善のみならず、成功するとハードメトリックスを表します。

  1. 場所-XX:+HeapDumpOnOutOfMemoryErrorきJVMの起動パラメータだけでなく、
  2. 乗用jmapの走行JVM(jmap-histo <pid> 下負荷
  3. Analyizeメトリックス(jmap-histo出され、jhatいヒープダンプ).いのであることをご記憶のどこからかの予想外でした。

もちろんその他のツールがjmap&jhatいてJava5+'に'

私とファイルに地元の温度やその後産卵に別のスレッドのストリーミングで、tomcatサーブレットのスレッドで再配布することができます。.このようなことio。

ああ、とは思わないまできない。ですので、音声やふやで......。Tomcatのスレッドとの接続が必要です。場のスレッド飢餓を増やスレッドです。/conf/server.xml.再度メトリクスの方法を検出すこと--ないだろう。

質問おもにEC2?うtomcatのJVMの起動パラメータ?

tobyできるよう直S3ができます。できない場合は、質問はちょっと曖昧に的確に対応:どれくらいの大きさでjavaヒープ?どのように多くのストリームを同時に開きのメモリ?
どれくらいの大きさでおread write/bufer(8K)?
いただいた皆さまには、8Kストリームから、その文8kに出力す。きを読むように全体画像からS3,バッファでは、記憶、そして発送のものでは一回しか出来ないのですか?

ご利用の場合8Kバッファを使って1000同時流行く~8Megsのヒープスペースは、絶え間違っています。...

余談ですが、なかったり8Kの薄い空気の中、デフォルトのサイズのためのソケットバッファでは、送信データか1Megますがブロックにtcp/ipスタックの開催は大量のメモリを消費します。

をご確認ください。は二つのことをやろうとしてい

  • ま閉会のストリーム?非常に重要な
  • 思いをストリームに接続します。ストリームには、とても広いとは言えませんが、多くの渓流が同時にできる盗むすべてです。作成プールのようにできない場合もありますので定数ト走行を同時に

るもののほか、ジョンが示すフラッシュを繰り返しの出力ストリームです。によってウェブコンテナにすることができるキャッシュ部品も全て出力にフラッシュで一(例えば、計算にContent-Lengthヘッダ).この燃焼ものメモリを消費します。

できる構造ファイルの静的ファイルは別々に自分のバケット最速の性能を現在まで続を実現し、Amazon S3CDN, CloudFront.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top