我的工作涉及从套接字交易报价读取的任务,我需要实现最小的延迟和高吞吐量。
我从最简单的java nio原型开始,如下所示:
ByteBuffer buf = ByteBuffer.allocateDirect(BUFFER_SIZE);
try {
buf.clear();
int numBytesRead = socketChannel.read(buf);
if (numBytesRead == -1) {
socketChannel.close();
} else {
buf.flip();
byte[] byteArrived = new byte[buf.remaining];
buf.get(byteArrived,0,byteArrived.length);
// here we send byteArrived to the parser
}
} catch (IOException e) {
}我猜每次创建byte[]数组都很差劲,但由于缺乏知识,我不知道如何解析ByteBuffer (因为我需要将字节协议解组为消息,并将它们传递到业务逻辑中)。你能推荐一下如何避免大量垃圾的产生吗?
另外,我想问一下如何组织低延迟和高吞吐量的套接字读取的最佳实践?我读到过关于LMAX和disruptor框架的文章,他们在单线程上实现了600万事务。
发布于 2011-11-30 04:11:07
您可以使用Disruptor和其他方法实现更高的性能。这在很大程度上取决于消息的大小和复杂性(以及您如何处理消息!!)
如果希望使用ByteBuffer进行序列化/反序列化,请使用putXxxx和getXxxx方法。为了使此过程更容易,我建议将每条消息的长度放在第一位,以便您可以在尝试解析消息之前检查是否有完整的消息。
您可能会发现此演示文稿很有趣,http://vanillajava.blogspot.com/2011/11/low-latency-slides.html
发布于 2011-11-30 18:00:09
假设您可以调整解析器API以接受(byte[] buffer, int offset, int length)作为参数,那么您可以只将(bb.array(), 0, bb.limit())作为参数传递,而不必在每次读取时创建new byte[]。然而,这不太可能是决定速率的步骤。
https://stackoverflow.com/questions/8316891
复制相似问题