私たちが知っていたように、従来の IO を使用してサーバーを構築する場合、どこかでブロックする必要があるため、ループまたは 1 スレッド 1 ソケット モードを使用する必要がありました。だから、ニオが永遠に良い選択かどうか知りたいですか?
7 に答える
IMHO、Blocking IO は一般的に使用するのが最も簡単であり、システムからより多くを要求する特定の要件がない限り、最も単純なオプションを使用する必要があります。
次の最も簡単なオプションは NIO をブロックすることです。これは、IO よりも効率や制御が必要な場合によく使用します。これはまだ比較的単純ですが、ByteBuffers を使用できます。たとえば、ByteBuffers はリトル エンディアンをサポートします。
一般的なオプションは、セレクターでノンブロッキング NIO を使用することです。これがもたらす複雑さの多くは、Netty や Mina などのフレームワークで処理できます。サーバーごとに数千の同時接続がある場合など、ノンブロッキング IOが必要な場合は、このようなライブラリを使用することをお勧めします。IMHO何千もの接続があります。各接続が非常に些細なことでない限り、サーバーを増やすことを検討する必要があります。AFAIK googleは、サーバーごとに数千のユーザーではなく、より多くのサーバーを求めています。
より極端なオプションは、NIO2 を使用することです。これは、ノンブロッキング NIO よりもさらに複雑で、書き込みに時間がかかります。これをうまくサポートするフレームワークは知りません。つまり、実行すると実際には高速になります。AFAIK Infiniband (サポートするように設計されたもの) を使用している場合は使用する価値があるようですが、イーサネットを使用している場合はおそらく使用する価値がありません。
ノンブロッキング IO が必要な場合、NIO は適切な選択肢ではありません。Java ではこれが唯一の選択肢です。古い IO の方がコーディングしやすいため、今でも定期的に古い IO を使用していることに注意してください。NIO API は非常に未加工であり、クライアント側 API よりも低レベルのテクノロジを有効にします。ノンブロッキング IO を使用して解決したい問題へのより単純なインターフェイスを提供する API を介して NIO を使用することをお勧めします。
少し遅れましたが、個人的には、通常の「日常」のファイル処理にも NIO を使用しています。だから、私は次のようなものを使用します:
1. if(Files.notExists(path)) { }
2. Files.createDirectory(path);
3. Files.newInputStream(path) targetPath.resolve("somefile.txt");
4. Files.newBufferedWriter(path, charset);
5. DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path);
それは私にとってはうまくいきます。relativize や resolveSibling などのメソッドがあるため、古い File ではなく Path を好みます。
IO よりも複雑ではありません。
「超高速」サーバーを作成しない限り、これを使用できます。
もちろん、ここでの適切なアプローチは nio を使用することです。これは、高スループット タスク用のマルチクライアント サーバーを作成する新しい最新の方法であるためです。
従来の IO は簡単で単純化されたコードであり、NIO はより複雑ですがより柔軟です。私の場合、小さなストリーミングにはIOを使用し、大きなストリーミングにはNIOを使用することを好みますが、nioは実際にはより複雑です
NIOでは、スニペットを直接使用するioパッケージの代わりに、パッケージ全体を作成して管理する必要があります