我们有一个使用UDP多播发送日志事件的日志记录系统。事件发生率约为10,000次/秒,平均事件大小约为2Kb。Java NIO UDP多播 - 丢弃的数据包
在每次测试期间,应用程序的NIO版本都会失去一小部分事件(大约12M的约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