UDPマルチキャストを使用してログイベントを送信するロギングシステムがあります。イベントレートは約10,000イベント/秒で、平均イベントサイズは約2KBです。Java NIO UDPマルチキャスト - 廃棄パケット
NIOバージョンのアプリケーションでは、テストごとにイベントのマイナーパーセンテージ(約2000万イベント〜2000件)が失われます。この点に関して誰もが洞察力を持っていますか?
サンプルコード:NIOなし :
byte[] buf = new byte[65535];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
try {
while (!Thread.currentThread().isInterrupted()) {
socket.receive(packet);
final byte[] tmpBuffer = new byte[packet.getLength()];
System.arraycopy(packet.getData(), 0, tmpBuffer, 0,
tmpBuffer.length);
insertToNonBlockingQueue(tmpBuffer, packet.getSocketAddress());
}
} catch (Throwable t) {
throw new RuntimeException("Encountered exception in Acceptor", t);
} finally {
Util.closeQuietly(socket);
}
NIO付:
ByteBuffer inBuffer = ByteBuffer.allocate(65535);
try {
while (!Thread.currentThread().isInterrupted()) {
SocketAddress addr = channel.receive(inBuffer);
inBuffer.flip();
final byte[] tmpBuffer = new byte[inBuffer.limit()];
inBuffer.get(tmpBuffer);
inBuffer.clear();
insertToNonBlockingQueue(tmpBuffer, addr);
}
} catch (ClosedByInterruptException ex) {
log.info("Channel closed by interrupt"); // normal shutdown
} catch (Throwable t) {
throw new RuntimeException("Encountered exception in Acceptor", t);
} finally {
Util.closeQuietly(channel);
}
リスナーが同時に実行され、すべての時間は、非NIOのバージョンは一方で、すべてのログイベントをキャプチャ両NIOバージョンはいくつか欠けています。これは、マシン上の他のバージョンにコードを切り替えるときでさえ同じ挙動をするので、ネットワークの問題ではありません。
申し訳ありませんが、コードを貼り付けてコピーすると、コードにbuffer.clear()が含まれていましたが、反映されるように投稿を編集しました – user2677485