rat*_*olt 20 java servlets nio jetty nonblocking
我是NIO的新手,我正在试图弄清Jetty如何利用NIO.
我对使用阻塞IO服务请求的传统servlet容器的理解如下:
doGet调用servlet方法(etc)InputStream和OutputStreamInputStream并写入OutputStreamInputStream和OutputStream基本上与基础的相应流Socket使用NIO连接器时有何不同?我的猜测大致如下:
InputStreamOutputStream)doGet处理上述包装器流的servlet方法(etc)SocketChannel从Jetty文档中,我发现了以下内容:
SelectChannelConnector - 此连接器使用具有非阻塞线程模型的高效NIO缓冲区.Jetty使用Direct NIO缓冲区,并仅将线程分配给具有请求的连接.同步模拟对servlet API的阻塞,并且在请求处理结束时任何未刷新的内容都是异步写入的.
我不确定我明白是什么Synchronization simulates blocking for the servlet API意思?
gre*_*egw 32
你没有完全正确.当jetty使用NIO连接器(并且9仅支持NIO)时,它的工作方式如下:
当选择器看到IO活动时,它会在连接上调用handle方法,该方法可以是:
如果调度了一个线程,那么它将尝试读取该连接并解析它.现在发生的事情取决于连接是http,spdy,http2还是websocket.
一旦线程被分派到一个servlet,它就会像servlet IO一样阻塞它,但是在HttpInputStream和HttpOutputStream的层次下,所有IO都与回调异步.阻塞API使用特殊的阻塞回调来实现阻塞.这意味着如果servlet选择使用异步IO,那么它只是绕过阻塞回调并且或多或少直接使用异步API.
这个视图稍微复杂了http2和spdy,它们是多路复用的,因此它们可能涉及额外的分派.
任何不调度的HTTP框架都可以在基准代码中真正快速地运行,但是当面对一个真正的应用程序时,可以做一些愚蠢的事情,比如阻塞数据库,文件系统,REST服务等......那么缺乏调度就意味着一个连接可以阻止系统上的所有其他连接.
有关jetty如何处理异步和调度的更多信息,请参阅:
| 归档时间: |
|
| 查看次数: |
10543 次 |
| 最近记录: |