在
apache HTTPComponent document有一个声明:
Contrary to the popular belief,the performance of NIO in terms of raw data throughput is significantly lower than that of blocking I/O.”
真的吗?有人可以更详细地解释一下吗?什么是典型的用例
request / response handling needs to be decoupled
解决方法
当你可以处理请求时,应该使用非阻塞IO,在一些其他执行上下文(不同的线程,对另一个服务器的RPC调用,一些其他异步机制)上调度它以进行处理,并释放web服务器的线程来处理更多的传入请求.当响应处理完成后,将调用响应处理线程,并将响应发送给客户端.
我建议阅读netty documentation以更好地理解这个概念.
至于更高的吞吐量:当您的服务器发送/接收大量数据时,所有这些上下文切换以及在线程之间传递数据都会严重影响整体性能.可以这样想:你收到一个大请求(带有大文件的PUT请求).您需要做的就是将其保存到磁盘,然后返回OK.开始在线程之间抛出它可能会导致更少的mem-copy操作,如果你只是把它扔到同一个线程的磁盘上就需要了.以异步方式处理此操作不会提高性能:虽然您可以将请求处理线程发布回Web服务器的线程池并让它处理其他请求,但您的主要性能瓶颈是您的磁盘IO,在这种情况下 – 尝试同时保存更多文件,只会让事情变慢.
我希望我足够清楚.如果您需要更多解释,请随时在评论中提出更多问题.