我想知道,如果像Tomcat,Jetty等servlet容器已經使用nio讀取和寫入數據,是否真的需要在servlet輸入和輸出流上使用setWritelistner
和setReadListner
?是否有額外的性能增益?使用servlet 3.1異步io的任何真正的好處?
回答
好處不是直接關於「性能增益」。這些方法的目的是在讀取輸入(POST)數據或寫入文檔時避免請求線程(處於異步模式)阻塞。
Java EE7教程中有一個示例:"17.13.1 Reading a Large HTTP POST Request Using Non-Blocking I/O"(鏈接已更新)。
這與Tomcat在封面下使用nio是正交的。
1-有間接的性能收益。當線程可能阻塞網絡I/O時,增加吞吐量的另一種策略是增加工作線程的數量。但是這會增加內存佔用(導致更多「開銷」)。
Tomcat的讀取頭(和在一個NIO非阻塞模式這樣做) 但讀出請求機構是一個應用程序的關注,並與阻塞IO執行 (直到說明書的Servlet 3.0要求)。同樣, 寫入響應是通過阻塞IO來完成的,因爲這也是規範的要求 。
所有這些都隨Servlet 3.1而改變。
您可能希望看到email Thread這個
下面對和代碼樣本是從Java EE 7 Recipies它解釋了使用setWritelistner和setReadListner
的要實現非阻塞I/O解決方案,新編程接口 已被添加到ServletInputStream和ServletOutputStream中,以及 作爲兩個事件偵聽器:ReadListener和WriteListener。 ReadListener 和WriteListener接口通過在 服務器內容可以在不阻塞的情況下讀取或寫入時調用的回調方法以非阻塞方式進行servlet I/O處理。使用 ServletInputStream.setReadList ener(ServletInputStream,AsyncContext) 方法向ServletInputStream註冊ReadListener,並使用 的I/O讀取 ServletInputStream。 setWriteListener(ServletOutputStream,AsyncContext) 註冊WriteListener的方法。代碼 以下行演示瞭如何用 ServletInputStream註冊ReadListener實現:
AsyncContext context = request.startAsync();
ServletInputStream input = request.getInputStream();
input.setReadListener(new ReadListenerImpl(input, context));
異步IO可以對在某些情況下的性能產生深遠的影響。我的經驗主要是與ASP.NET相同,但它也應該適用於此。
一個servlet具有有限數量的線程來處理請求。如果存在任何阻塞IO(網絡請求,數據庫查詢等),則處理請求的線程在等待IO完成時處於使用狀態。在高容量的情況下,這可能會導致線程池餓死並導致嚴重的性能下降。
使用異步IO,IO不會阻塞請求線程。相反,回調被註冊並隨後在IO完成時被調用。與此同時,線程返回到線程池,可以繼續處理其他請求。
- 1. 使用CFWriteStream的異步IO
- 2. Java - Servlet 3.0中的異步與Servlet 3.1中的NIO
- 3. 好的F#異步IO樣本
- 4. 瞭解Akka Actor和異步IO的好處
- 5. 異步HTTP的好處有什麼好處異步HTTP
- 6. 異步和Parallel.ForEach對IO操作的潛在好處
- 7. C#封裝io與任務,使異步
- 8. 取消/中止異步servlet處理的任何問題
- 9. NodeJS如何處理異步文件IO?
- 10. C#真正的好處Threadpooling
- 11. Servlet 3 Tomcat 7上的異步任務
- 12. 在Spring CLI中使用Java進行異步IO處理如何?
- 13. Java中的異步IO?
- 14. 異步調用和異步io調用之間的差異.net
- 15. 的Servlet 3.0異步
- 16. 是playframework真正異步嗎?
- 17. 跨進程的異步IO
- 18. 使用r的異步網絡IO:任何現有的軟件包
- 19. 異步IO與CFReadStream
- 20. 如何使用異步servlet +非阻塞IO進行文件下載?
- 21. 如何使用servlet asyncIO進行異步處理?
- 22. 我真的在這裏使用任務和異步獲得任何東西嗎
- 23. 真正異步的WCF服務
- 24. 異步Servlet異常
- 25. 如何理解Windows中的異步io?
- 26. ASP.NET真正的異步操作
- 27. 如何使BeginGetRequestStream和BeginGetResponse真的異步?
- 28. 使用stdio.h異步緩衝io?
- 29. PLINQ有什麼真正的好處?
- 30. Grails - Servlet 3.0異步請求處理
我開始閱讀有關的servlet 3.1的信息,但如何將作業發送到後臺執行,並在servlet返回inmediatly釋放容器線程,正在獲得的東西,在執行其線程itselft,所以資源並不清楚我將被消耗。 –
異步的獲得利益,如果你能避免阻塞請求線程在等待類似請求到後端服務來完成。顯然,如果你正在後臺線程中做實際的工作......而不是其他機器...你沒有取得多大成就。我想你在考慮錯誤的用例。 –
那麼,當另一臺服務器完成這項工作時,真正獲得它的嗎?像微服務一樣?這不是一臺服務器在做任何事情嗎?即使這個服務器是一個多層應用程序? –