一種單機支持 JavaWeb 容器萬級併發的設想

當前的大部分 Java web 容器基於 Bio 線程模型,例如常見的 tomcat ,默認 200 線程,即 200 鏈接。由此帶來的問題是,若是想提升併發,或者提升資源利用率,就得加大線程數。web

以下圖:sql

因而出現了類 Netty 的 Reactor 線程模型。同時,Java 官方也設計了 Servlet 3 異步 API,能夠經過返回類 Feature 的方式,實現異步編程。在某些狀況下,也能夠實現萬級別併發。數據庫

Servlet 3

可是,爲何 Java 社區的異步編程沒法推廣開來?究其緣由,數據庫是罪魁禍首,再往上看,實際上是 JDBC 的鍋,JDBC 定義了一套阻塞式的數據庫 IO 通訊模型。這致使每次請求,線程都阻塞在等待 DB 結果。進而致使,服務器資源沒法充分利用。編程

有沒有一種辦法,讓 Java web 應用的整個鏈路都是非阻塞的呢?tomcat

答:有。服務器

異步編程是提升生產力的關鍵。下圖是咱們今天假設的模型:併發

新的設想模型

其實很是簡單。異步

咱們讓 tomcat 支持 Servlet 3 異步編程模型,接口返回 feature 便可,這個功能其實有不少web 容器都實現了。關鍵的是,咱們讓 DB 客戶端和服務器都支持異步編程模型。讓 DB 像 netty 複用 IO 鏈接,業務線程只須要將 SQL 交個 數據庫 client 便可返回 feature,而後釋放當前線程(不再用阻塞,這是關鍵),等 DB 操做結果返回時,只需通知這個 feature 便可。這將極大的提升線程的利用率,不誇張的說,只需 8 條線程,就足以承受萬級別的併發。異步編程

整個的調用流程以下圖:高併發

新的調用流程設想

咱們看到,當一個 http 請求過來,整個流程是無阻塞的,不用等待 數據庫 返回結果,業務只需添加回調便可,當數據庫結果返回時,自動觸發回調。

固然,這只是個人一個小設想,Mysql 要重寫鏈接器,我估計是太難了。可是,那些新一代的數據庫,是否可以把鏈接器設計成支持異步、支持多路複用的呢?這樣,web 應用的客戶端,就可以把整個鏈路設計成異步的,這將節約不少資源,提升生產力。

但願那一天快點到來。

相關文章
相關標籤/搜索