2016-12-29 42 views
0

Vertx工人verticle池我是新來的Vert.x,我想實現輔助verticles池要使用BoneCP數據庫查詢。不過,我對如何「調用」它們的工作以及如何在它們之間共享BoneCP連接池有點困惑。對於JDBC

我在Vertx DeploymentManager source中看到,start(Future)方法被同步調用,然後Verticle保留在內存中直到取消部署。在start方法完成之後,在工作者Verticle上調用方法的正確方法是什麼?如果我部署Verticle的多個實例(使用DeploymentOptions.setInstances()),Vertx會在它們之間進行負載平衡嗎?

我看到Vert.x帶有一個JDBC客戶端和工作池,但它限制了數據類型,我可以,因爲它使用的EventBus和序列化由數據庫返回的所有數據進行工作。我需要處理許多不同的數據類型(包括日期,BigDecimals和二進制對象),我想盡可能避免序列化,而是在工作者Verticle中進行查詢,處理結果並通過Future或AsyncResult返回對象(我相信這是在堆上完成的,所以不需要序列化;這是正確的嗎?)。

請幫我理清所有這些問題:)如果你給我,我怎樣才能使這項工作的例子,我將非常欣賞的!

謝謝!

回答

0

在你start(...)方法,事件偵聽器註冊事件總線,因爲這是你如何與verticles(工人與否)進行交互。 是的,如果您部署多個實例,Vert.x將使用循環法將消息發送到這些實例。

對於你的描述,Vert.x可能不是最合適的,因爲它在最佳狀態下的異步I/O。 使用標準的Java併發工具來管理負載,即執行者和朋友可能會更好。

+0

感謝您的幫助。爲了處理請求,我將在事件總線上使用偵聽器設置我的Verticle,但我仍然需要處理如何在它們之間共享jdbc連接池。我想在Vert.x中實現這個功能來學習框架,並利用異步I/O來以更少的資源處理大量請求。 – rober710

0

我會盡力回答您的一個問題之一。

如何 '叫' 他們的工作

你打電話給你的工人verticles使用EventBus。這是他們之間溝通的正確方式。請看下面的例子:
https://github.com/vert-x3/vertx-examples/blob/master/core-examples/src/main/java/io/vertx/example/core/verticle/worker/MainVerticle.java#L27

如何共享它們之間的BoneCP連接池。

不要。相反,請爲每個連接池創建一個連接池。否則,它會導致意外的行爲。

config.setMinConnectionsPerPartition(1); 
config.setMaxConnectionsPerPartition(5); 
config.setPartitionCount(1); 

將Vertx做負載之間的平衡

號這@Jochen Bedersdorfer的原因,我建議使用EventBus。正如你所建議的那樣,你可以引用你的工作者椎骨,但是你仍然堅持1:1的配置。

回報通過未來或AsyncResult(我認爲這樣做是對堆 ,所以沒有必要序列化?,這是正確的)一個對象

這是正確的。但是,再次,你堅持1:1映射。在序列化(即使用緩衝區)的性能方面,情況更糟糕。

如果您還確實需要類似的東西,也許你不應該在所有使用工作verticles,但類似.executeBlocking
https://github.com/vert-x3/vertx-examples/blob/master/core-examples/src/main/java/io/vertx/example/core/execblocking/ExecBlockingExample.java#L25