繁体   English   中英

如何使用Java NIO从套接字高效读取

[英]How to read efficiently from socket using Java NIO

我正在处理涉及从套接字交易报价中读取的任务,我需要实现最小延迟和高吞吐量。

我从这样的最简单的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 []数组都是很me脚,但是由于缺乏知识,我不知道如何解析ByteBuffer(因为我需要将字节协议解组到消息中并将它们传递到业务逻辑中)。 您能推荐如何避免大量垃圾的产生吗?

我也想问一下最佳实践,如何组织具有低延迟和高吞吐量的套接字读取? 我了解了LMAX和中断框架,它们在单线程上实现了600万笔交易。

您可以使用Disruptor和其他方法实现更高的目标。 很大程度上取决于消息的大小和复杂性(以及您对消息的处理方式!)

如果要使用ByteBuffer进行序列化/反序列化,请使用putXxxx和getXxxx方法。 为了简化此过程,建议您将每条消息的长度放在首位,以便您在尝试解析消息之前检查是否有完整的消息。

您可能会发现此演示文稿很有趣http://vanillajava.blogspot.com/2011/11/low-latency-slides.html

假设您可以使解析器API适应以接受(byte[] buffer, int offset, int length)作为参数,则只需传递(bb.array(), 0, bb.limit())作为参数,而不必创建每次读取时都使用new byte[] 但是,这不太可能是速率确定步骤。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM