# vert.x學習筆記

標籤: 技術架構


1. 自定義啓動文件server.groovy分析(用到的vertx方法)

  • use GroovyShell to execute scripts to extend chain handler new GroovyShell(binding, compileConf)
  • 設置定時任務 vertx.setPeriodic(interval)
  • 啓動httpserver vertx.createHttpServer()
  • 添加websocket支持. vertx.createSockJSServer
  • 啓動tcpserver vertx.createNetServer()

2 vert.x 學習

vertx 特性
Vert.x基於全異步Java服務器Netty,並擴展出了很多有用的特性。Vert.x的亮點有:

  • 支持多種編程語言
  • 異步無鎖編程
  • 對各種IO的豐富支持——目前Vert.x的異步模型已支持TCP、UDP、FileSystem、DNS、EventBus、Sockjs等;
  • 支持分佈式開發(event bus總線實現)
  • 生態體系成熟(Eclipse 基金會管理維護.異步驅動已經支持了Postgres、MySQL、MongoDB、Redis等常用組件)
  • Reactor模式(耗時操作交換異步線程去做,執行完異步回調)

reactor模型解釋

vertx原理解釋

在Vert.x裏,如果你不使用Vertx對象,你幾乎是寸步難行。

Vertx對象扮演着Vert.x控制中心的角色,同時它也提供了大量的功能,例如:

創建客戶端和服務器
獲得event bus引用
設置定時器

如果你將Vert.x嵌入到你的應用程序中,你可以向下面這樣獲得一個Vertx對象的引用

Vertx vertx = Vertx.vertx();

If you’re using Verticles
注意: 在絕大多數應用程序中,你只需要一個Vert.x實例,但是如果你想要創建多個Vert.x實例,這也是可以的,例如你想要將event bus或者服務器與客戶端進行隔離

Vert.x APIs大多數是基於事件驅動的。這意味着,在Vert.x中,當你關注的事件發生時,Vert.x會自動通知你。
例如當下面這些事件發生時,Vert.x就會自動通知你

  • 定時器被觸發
  • socket中接收到數據
  • 從磁盤中讀取數據已經就緒
  • 異常發生
  • HTTP服務器接受到一個請求

我們需要通過向Vert.x APIs提供handler來處理Vert.x通知給我們的事件,例如下例中演示了我們每秒從定時器中接受一個事件
Vert.x API不會阻塞任何線程,因此你可以使用少量的線程來處理非常大的併發量

  • 我們在前文中提到過Vert.x是基於事件驅動的,當Vert.x事件準備好之後,就會向事件傳遞給被設置的handler上
  • 在大多數情況下,Vert.x會使用一個稱爲event loop的線程來調用你的handler

鑑於Vert.x以及你的應用程序不會產生任何阻塞操作,event loop會快速地將事件分發到不同的handler上
因爲我們的任何操作都不會帶來任何阻塞,因此一個event loop就可以在非常短的時間內,分發出去居多的事件。例如一個event loop就可以非常快速地處理數千個HTTP請求。

我們把這種模式稱爲Reactor Pattern.

你也許以前就聽說過這種模式,例如Node.js就是這種模式的一種實現

在一個標準reactor實現中,會有一個單獨的event loop線程進行可用事件輪詢,只要有事件接聽到,就將它發送到全部的handler上

但是這種實現有個小缺點,在任一時刻,它都會只運行在一個核心上,因此如果你想要你的單線程reactor應用程序在多核心服務器上進行拓展,那麼你就需要啓動並管理多個不同的reactor應用程序進程

但是Vert.x的工作模式與之不同。相比單線程event loop,每個Vertx實例都包含數個event loop. 在默認情況下,我們會根據所在機器的可用核心數來設置event loop數量,當然你也可以自己指定這個數量

我們把這種模式稱爲Multi-Reactor Pattern

注意:儘管Vertx實例會持有多個event loop,但是每一個handler都不會被併發執行, 而且在大多數情況下(工作者verticle除外),handler會被同一個event loop執行
  • event loop調用阻塞操作,event loop會一直等待,辦法就是通過調用executeBlocking方法來執行阻塞代碼
  • Vert.x引入了一個簡單的可擴展的類actor的部署和併發模型.Verticle之於vertx相當於Actor模型中的actor
  • Vert.x中進行數據傳播的大多是org.vertx.java.core.buffer.Buffer實例

用友iUAP馬太航:Vert.x事件模型機制分析

  • Vert.x是事件驅動的,其處理請求的高性能也是基於其事件機制。Vert.x的事件機制中有幾個非常重要的概念:Event Loop、Event Loop Vertical、Worker Vertical、Event Bus、Vert.x Module。

  • Event Loops:即事件循環,是由Vert.x啓動的事件處理線程,也是Vert.x項目對外開放的入口,Vert.x由此接收請求事件。一個Vert.x有一個或多個事件循環線程組成,線程最大數量爲主機有效的CPU核數。

  • Event Loop Vertical:事件的業務處理線程,存在於Event Loop中,用於處理非阻塞短任務。

  • Worker Vertical : 事件的業務處理線程,用於處理長任務阻塞任務。

  • Event Bus:即事件總線,用於事件管理和數據傳遞,是Vert.x事件模型中最核心的部分,所有的事件都經由事件總線進行分發,包括Vertical之間的通信事件。

  • Vert.x Module : Vert.x項目模塊,一個應用通常由多個模塊組成,每個模塊一般包含多個Vertical。

  • Vert.x以非阻塞IO的思想來實現高性能,非阻塞IO的實現,基於Event Loop Vertical和Worker Vertical的分離。在Vert.x中,Event Loop用於接收請求,並將短業務操作交由其內部的Vertical來處理,該模塊是非阻塞的,這樣可以保證請求的處理效率;阻塞任務通過Vert.x的事件機制脫離當前線程,生成一個任務事件交由Event Bus進行管理,Event Bus中註冊了所有的監聽事件,通過事件匹配選擇合適的Worker Vertical,並將任務交由Worker Vertical進行處理,Worker Vertical處理完成後,將數據和事件信息進行封裝,返回給Event Bus,Event Bus再次匹配事件定位到來源Vertical,然後將數據返回給Vertical,Vertical進一步將數據返回給客戶端。將這一過程實現的核心是Event Bus,Event Bus管理所有的事件,通過事件匹配和數據傳遞,將整個流程鬆耦合地銜接起來,讓阻塞任務和非阻塞任務的分離成爲可能。

下面以一個HTTP請求的處理過程詳述Vert.x的事件處理流程。Vert.x啓動時,會將Worker Vertical的事件監聽信息加載到Event Bus中,包括監聽事件類型和事件處理函數。當一個HTTP請求發送到Vert.x構建的應用時,Event Loop首先接收到請求,並對請求做分析、包裝,然後將事件交給Event Bus來處理,Event Bus爲此次請求事件添加一個事件ID,然後根據註冊的Worker Vertical事件尋找已經註冊的Worker Vertical監聽函數,若未找到則會拋棄該事件,若找到則會對處理類進行實例化(此處使用線程池來管理),並同時使用事件ID在Event Bus中註冊一個返回結果處理事件,該事件對應來源Event Loop Vertical。下一步由Worker Vertical實例執行事件處理函數,事件處理函數中通常包含業務處理、數據庫操作等。Worker Vertical實例處理結束後,將返回結果和事件信息返回給Event Bus,Event Bus找到在其中註冊的來源Event Loop Vertical實例,然後將返回數據交給該實例處理,Event Vertical實例進一步處理數據並將結果返回給瀏覽器。

事件驅動的處理過程,數據傳遞是非常重要的,Vert.x支持任意對象的數據格式。但使用對象時經常會遇到序列化和載入類的問題,比如在使用Java對象的時候,這種情況下使用JSON會更方便,這也是Vert.x推薦採用的方式。

Vert.x的事件模型,有如下幾個特點:

  • 1.非阻塞處理請求,異步執行阻塞程序,保證了請求處理的高效性。
  • 2.使用Event Bus事件總線來進行通訊,可以輕鬆編寫出分佈式、鬆耦合、高擴展性的程序。
  • 3.使用Event Bus事件總線是Vert.x真正實現多語言支持的基礎,目前Vert.x已支持Java、Javascript、Ruby、python、Groovy、Clojure、Ceylon。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章