????????Vert.x是在JVM上構(gòu)建響應式應用(reactive application)的工具集兼都。Vert.x是事件驅(qū)動的和非阻塞的,這意味著應用程序可以使用少量內(nèi)核線程來處理很多并發(fā)乒裆。本文基于Vertx3.0版本講解。
Vert.x特性
????響應式的(Responsive):一個響應式系統(tǒng)需要在合理的時間內(nèi)處理請求秋茫。
????彈性的(Resilient):一個響應式系統(tǒng)必須在遇到異常(崩潰布疼,超時, 500 錯誤等等)的時候保持響應的能力米诉,所以它必須要為異常處理而設(shè)計菱蔬。
????可伸縮的(Elastic):一個響應式系統(tǒng)必須在不同的負載情況下都要保持響應能力,所以它必須能伸能縮,并且可以利用最少的資源來處理負載拴泌。
????消息驅(qū)動(Message driven):一個響應式系統(tǒng)的各個組件之間通過 "異步消息傳遞" 來進行交互魏身。
????多種語言支持:只要能運行在JVM上的語言,基本都支持蚪腐。
????簡單的并發(fā)模型:就像寫單線程代碼一樣簡單箭昵,多線程并發(fā)由Vertx控制。
????集群支持:在同一個Vertx集群回季,各個Verticle 實例間可以通過Event Bus通信家制。同時也支持跨進程的TCP Event Bus。
????Vertx使用Netty4處理所有的網(wǎng)絡(luò)IO泡一。
概念模型
通常颤殴,一個進程會創(chuàng)建一個Vert.x實例,Vert.x負責部署Verticle和管理運行時資源鼻忠。
Verticle實例之間可通過EventBus發(fā)送異步消息來通訊涵但,Verticle中的Handler處理發(fā)送來的消息。
在集群模式下帖蔓,通過ClusterManager可發(fā)現(xiàn)遠程Verticle矮瘟,EventBus從而可將消息路由到遠程Verticle。
架構(gòu)模型
Vertx的AcceptorEventloopGroup只有1個AcceptorEventloop讨阻,即通過1個線程監(jiān)聽所有客戶端的連接芥永,連接建立后會交由VertxEventLoopGroup中的一個EventLoop來處理。
Vertx可以將server(HttpServer,TcpServer,UdpServer)部署在多個verticle實例中钝吮,這些verticle實例共享這個server埋涧。AcceptorEventloop監(jiān)聽和處理連接事件,但NIO讀寫事件的觸發(fā)和處理都在VertxEventLoopGroup的EventLoop中執(zhí)行奇瘦。
每部署1個verticle實例棘催,都會為該verticle創(chuàng)建1個執(zhí)行context(每個context都綁定一個EventLoop和Handler處理線程),傳入的業(yè)務(wù)request事件都在此context對應的Handler處理線程中執(zhí)行耳标。
對于標準模式的verticle醇坝,context對應的Handler處理線程就是該verticle綁定的EventLoop線程;對于worker模式的verticle次坡,context對應的Handler處理線程是worker線程呼猪。因此,對于標準模式verticle砸琅,編解碼handler宋距、request handler都在context綁定的EventLoop中執(zhí)行;對于worker模式verticle症脂,編解碼handler會在context綁定的EventLoop中執(zhí)行谚赎,但request handler會在context對應的worker線程中順序的執(zhí)行淫僻。
任何verticle中通過excuteBlocking方法提交的任務(wù),都會由worker線程池執(zhí)行壶唤;
當部署的verticle數(shù)量小于VertxEventLoopGroup的EventLoop數(shù)量時雳灵,會造成部分EventLoop空閑;當部署的verticle數(shù)量大于VertxEventLoopGroup的EventLoop數(shù)量時闸盔,多個verticle可能綁定同一個EventLoop悯辙。