您當前的位置:首頁 > 遊戲

tomcat 原始碼為啥不採用netty 處理併發?

作者:由 Yestin 發表于 遊戲時間:2016-12-10

tomcat 原始碼為啥不採用netty 處理併發?hongjiang2016-12-12 14:31:54

因為servlet規範,tomcat要實現servlet規範所以不能最大發揮NIO的特性,servlet3。0之前完全是同步阻塞模型,在read http body 以及 response的情況下,即使tomcat選擇 NIO的 connector也是模擬阻塞的行為,因為servlet規範規定的就是這樣。

可以參考以前的一篇blog:

tomcat對keep-alive的實現邏輯 | 寫點什麼

netty不用遵循servlet規範,可以最大化發揮NIO的特性,效能更高一些。但對於多數業務來講tomcat的connector已經足夠了。

tomcat 原始碼為啥不採用netty 處理併發?知乎使用者2017-02-08 16:05:35

tomcat用的是Apache的MINA網路庫,可以說是第一代Java網路庫,並且也支援NIO了。既然都有了這些庫了,功能也不差,為什麼不繼續開發MINA的功能,反而自廢武功,去換成Netty呢?

tomcat 原始碼為啥不採用netty 處理併發?知乎使用者2018-04-20 00:23:30

Tomcat是無比複雜的一套技術架構,內部的程式碼量也是非常龐大的,如果全盤切到Netty,會有相當大的重構工作。假如使用Netty重構了,新的版本出現了很多bug,會有被市場淘汰的風險。

tomcat 原始碼為啥不採用netty 處理併發?artshell2018-10-23 10:51:08

題主是不是想擺脫Servlet技術棧,Vert。x瞭解下,內部就使用了Netty

tomcat 原始碼為啥不採用netty 處理併發?何志斌2020-03-11 21:47:08

這兩種我都用過,我理解原因有以下幾個方面:

歷史的原因;

需求,就是其實有蠻多應用場景不需要那麼強的IO。譬如給Admin的管理介面,或者一般的應用沒有那麼多IOPS。其實有挺多的。

整個Java社群對於非同步的支援不夠好。其實就算是promise,async/await,Reactive,我覺得這些程式設計模式都比同步阻塞難於維護理解和除錯。所以如果Tomcat遷到NIO,如何處理程式設計模式,這是非常困難的。我自己在用Netty的時候只把netty用於非常高效能的部分,而且我儘量把程式碼抽取的像MVC。而我曾經讀過一個非常資深工程師寫的netty程式碼,裡面依然有執行緒安全的bug(一般測試都測不出來的那種)。

這道題我覺得答案歸納就是:沒有那麼必要,轉了也不一定好。

標簽: tomcat  NIO  netty  Servlet