在 < a href="/post/2013/10/real-time-web-with-vert-dot-x/">使用 Vert.x 作為即時網頁應用平台 這篇文章,山姆鍋提到「影化身平台」利用 Vert.x 作為即時 Web 應用的服務框架,看中的是它對網路服務的執行效率。除了方便網路服務開發外,Vert.x 的模組(module) 支援,對於寫大型網路服務來說是個很重要。

Vert.x 的模組功能

Vert.x 的模組支援功能並不是只是讓您可以邏輯性的模組化方式來設計應用,而是更進一步將模組包裝成可以獨立部署的套件 (package) 以方便不同環境的部署要求。Vert.x 的模組功能其實跟 Node.js 的 npm 或者 Ruby gem 是很類似的設計,說 Vert.x 是抄襲它們也不為過。

下列是 Vert.x 模組重要的特性:

1. 模組有自己的 classloader

為了避免模組間透過靜態全域 (static global) 變數來互相溝通,每個模組使用的類別 (class) 都由各自獨立的 classloader 來載入以確保模組間的獨立性。在並行程式的開發上,共用的變數常常是錯誤發生的根源之一,Vert.x 藉由這樣的限制,避免像是 race condition 的錯誤發生。

2. 模組可以包含相關的 Jar 檔

Vert.x 的模組設計主要用來封裝較大粒度的單位,通常一個模組也會包含相依的 Jar 檔,或其他資源。在「影化身平台」,我們就將整個 Cassandra 視為一個模組而不是讓各自的 Jar 檔成為一個模組。

3. 模組間可以有相依性

除了將需要的資源或者 Jar 檔包含在模組本身外,Vert.x 的模組間可以宣告相依的關係。依賴的模組可以存取被依賴模組提供的資源或者程式,但沒有像 OSGi 那樣精細的存取控制。

4. 模組可以按需要自動下載安裝

如果模組被存取時還不存在,Vert.x 可以自動從已知的套件庫下載並安裝該模組套件。這個特性在開發階段比較有用,在實際部署時,通常會需要確定相關模組都已經安裝完成。

應用到影化身平台

將應用的所有功能分散成多個高聚合的模組,但在測試、開發與部署時期又可以按照環境組合出需要的功能,這樣的特點,讓模組化應用一直被視為良好的軟體架構。藉由 Vert.x 模組支援,在開發階段,「影化身平台」的所有應用模組可以在同一個 JVM 上面執行來進行整合測試; 而到了部署階段,又可以根據部署環境的不同來配置哪些模組在哪一台主機上執行。

這樣的延展性,讓軟體的開發、測試與部署的方式盡可能接近外,也減輕準備開發環境的負擔。例如:將 Cassandra 也包裝成一個模組,除了 Eclipse IDE 外,開發人員幾乎不用另外安裝什麼就可以進行開發。運用 Gradle/Maven 的套件相依管理,需要的模組可以自動從套件庫自動下載,進一步簡化開發環境的設置要求。

除了方便開發,更進一步讓軟體直接採用模組 / 套件方式部署。由於每個模組是以可以部署的套件形式包裝並存放在本地或者遠端的套件庫 (Artifact repository) 中,在部署階段,只要下載指定版本的套件進行安裝便可完成應用的安裝與升級工作,這點對於之後達成持續部署的要求可說是一大助力。

小結

雖然 Vert.x 不像 Tomcat/Jetty 是符合標準規範的應用服務軟體,但作為即時 Web 應用服務容器,它也支援了最基本的應用部署功能。雖然它模組的設計有點陽春,但對於模組分離 (isolation) 要求不高的應用情境,簡單反而是一個優勢。