2016-11-20 79 views
2

Vert.x是用於在JVM上構建被動應用程序的工具包。Vertx縮放每個線程的實例數

我想使用vertx來實現基於JVM的可自動伸縮的RESTful後端API。

到目前爲止,我從文檔中發現,默認情況下需要使用機器內核的數量,假設您有N個內核併爲每個內核創建N個線程,每個線程都是一個事件總線,每個線程都是線程包含vertx實例。 問題是,Vertx如何控制實例的數量?基於負載壓力?

關於控制運行給定線程的Verticles數量,我仍然沒有得到。 請幫助清除此事。 假設該機擁有4個核心,我已經寫了延長爲AbstractVerticle兩類:

1)讓一個有些DB數據檢索(讓我們獵犬調用或「R」)

2)另一個假設一些轉換器(姑且稱之爲轉換器或 「C」)

現在我vertx運行或編譯和運行:

$ Java的罐子retriever.jar

$ Java的罐子converter.jar

因此,由於我們有4個內核,所以在開始時,Vertx將爲每個內核創建4個線程。

問題#1:

我們有多少獵犬&轉換器實例都可以在默認情況下每個線程?我猜這是每個線程一個實例? 對不對?所以我們共有4個核心,共有4個獵犬和4個實例。轉換器?正確?

問題#2:

在增加與增加的呼叫數來RETRIEVER( 「R」)和COVERTER( 「C」) 負載壓力的情況下(從1.000至1.000.000呼叫) Vertx會自動管理處理增加到我們系統的呼叫數量所需的「R」和「C」實例的數量嗎?

在計算器上有類似的問題一個問題: Can I set a capacity on the Vert.x HTTP request queue?

喬丹Halterman建議:「還請注意,您可以擴展到多個verticle情況下,您的HTTP服務器以處理更多的請求。在這種情況下,你可以使用靜態變量或共享數據在實例間共享信號量。「

問題#3:

但你怎麼究竟擴展您的verticle實例來處理更多的請求?我無法在文檔中找到它。

我很感謝您的幫助!

回答

9

您誤解了文檔。

首先,有一個事件總線(當Vert.x在集羣模式下啓動時,它在Vert.x實例之間共享)。它的作用是允許在你的Verticle之間傳遞消息傳遞風格。

請參閱The Event Bus部分。

然後在Vert.x中有不同類型的線程:事件循環線程和工作線程。默認情況下,Vert.x會創建與計算機上的核心一樣多的事件循環線程,以及一個包含20個工作線程的池。事件循環線程用於處理異步事件(讀取文件緩衝區,收到消息,...等)。工作線程用於執行應用程序的阻塞部分。

參見Multi-Reactor patternThe Golden RuleRunning Blocking Code

甲verticle是部署Vert.x單元。有三種類型的垂直,但你應該知道的兩種是「標準」垂直和「工作者」垂直。部署標準Verticle時會爲其分配單個事件循環線程。無論您在Verticle中處理哪種類型的事件,都將由此單個事件循環線程處理。工作者垂直保證一次由單個工作者線程執行。它可能不是每次都是同一個工作線程,但從來不會有兩個工作線程並行處理工作者垂直事件。

Verticles

最後,爲了縮放Vert.x應用程序,您部署verticles的多個實例。對於標準Verticle,每個實例將獲得一個不同的事件循環,因此您可以在覈心之間進行擴展。

Number of Verticles Instances

Vert.x不會自動調整Verticles人數爲您服務。儘管如此,您可以使用Vert.x監視工具來構建這些內容。

我相信這回答你的三個問題。

+0

謝謝!那回答了我的問題!基於負載壓力的自動縮放怎麼樣?還是有一個衡量標準,可以瞭解每個Verticle需要多少內存,以便可以計算出可以運行多少個Verticle? – JavaJedi

+0

沒有度量可以告訴你一個Verticle需要多少內存。通常您會執行負載測試來確定應用程序可以處理多少流量,而不會影響延遲。然後,您可以在安裝應用程序的同時部署儘可能多的機器並使用負載平衡器。 – tsegismont