私は特定のバイナリプロトコルを扱うTCPサーバを持っています。要求には、ファイルに書き込まれる大量のデータが含まれているものがあります。サーバーはNIOフレームワーク(netty)を使用し、複数のフレームに分割されたメッセージを処理するロジックを持っています。ファイルハンドルを開いたままにするか、必要に応じて再度開きますか?
個々のフレームが入ってくると、そのフレームのデータをファイルに書き込む場合は、ファイルを開いてデータを書き込みます。ストリームが終了していないにもかかわらず、同じファイルにデータのある別のフレームが追加されることが予想される場合でも、次のフレームを受け取るまでファイルを閉じます。その時点でファイルを開き、追加のデータを追加します。
私はこの方法を選択しました。オープンファイルハンドルを残すことを避けるのが最も安全な方法だったと思いますが、何らかの間違いでそれらを閉じることはできませんでしたが、パフォーマンスに悪影響を及ぼすことが懸念されます。ファイルハンドルを開いたままにしておく方が良いですか(この場合はベストプラクティス)(開いているFileOutputStreamまたはChannelへの参照を保持していますか?開いているファイルハンドルの数にリソースの制限がありますか?
どのような種類のボリューム(同時に開いているファイル)を検討していますか?どのくらいの頻度でフレームを受信していますか?多かれ少なかれストリーミング/リアルタイム?または長い遅延で?プレイにおけるリミットはその点で数百(または千)になる傾向があります。また、ファイルのオープン/クローズに要する時間とフレーム間の遅延時間を考慮する必要があります。 – BRFennPocock
これらのすべてが良い点です@BRPocock:この種の質問のほとんどは、本当に考慮すべき作業です。 –
@BRPocockのボリュームはうまくいけば増えているので、私は最高のスケーラビリティを提供するスイートスポットを見つけようとしています。フレームはストリーミング/リアルタイムです(問題のフレームは個々のTCPパケットだけです)。私は、最も安全でスケーラブルなファイルのクローズとベストパフォーマンスの可能性のあるファイルのバランスを取ろうとしています。 –