首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Java NIO高效地从套接字读取数据

如何使用Java NIO高效地从套接字读取数据
EN

Stack Overflow用户
提问于 2011-11-30 03:56:56
回答 2查看 4.9K关注 0票数 2

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

我从最简单的java nio原型开始,如下所示:

代码语言:javascript
复制
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万事务。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-30 04:11:07

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

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

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

票数 4
EN

Stack Overflow用户

发布于 2011-11-30 18:00:09

假设您可以调整解析器API以接受(byte[] buffer, int offset, int length)作为参数,那么您可以只将(bb.array(), 0, bb.limit())作为参数传递,而不必在每次读取时创建new byte[]。然而,这不太可能是决定速率的步骤。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8316891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档