我是Vert.x的新手,我想实现一个工作站Verticle池来使用BoneCP进行数据库查询。但是,我对如何“调用”它们以及如何在它们之间共享BoneCP连接池感到有点困惑。
我在Vertx DeploymentManager source中看到同步调用start(Future)
方法,然后将Verticle保留在内存中直到取消部署。 start
方法完成后,在worker Verticle上调用方法的正确方法是什么?如果我部署了多个Verticle实例(使用DeploymentOptions.setInstances()
),Vertx会在它们之间进行负载平衡吗?
我看到Vert.x附带了一个JDBC客户端和一个工作池,但它可以使用的数据类型有限,因为它使用EventBus并序列化数据库返回的所有数据。我需要处理许多不同的数据类型(包括日期,BigDecimals和二进制对象),我希望尽可能避免序列化,而是在worker verticle中进行查询,处理结果并通过Future或AsyncResult返回一个对象(我相信这是在堆上完成的,所以不需要序列化;这是正确的吗?)。
请帮我解决所有这些问题:)如果你举例说明我该如何运作,我将非常感激!
谢谢!
答案 0 :(得分:0)
在start(...)
方法中,使用事件总线注册事件侦听器,因为这是您与Verticle(worker或不是)交互的方式。
是的,如果部署了许多实例,Vert.x将使用循环法向这些实例发送消息。
对于您所描述的内容,Vert.x可能不是最合适的,因为它最适合异步I / O. 您可能最好使用标准Java并发工具来管理负载,即执行者和朋友。
答案 1 :(得分:0)
我会逐一回答你的问题。
如何“召唤”他们工作
使用EventBus调用您的工作人员Verticle。这是他们之间沟通的正确方式。请看这个例子:
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的原因。您可以按照建议引用您的工作者Verticle,但是您仍然坚持使用1:1配置。
通过Future或AsyncResult返回一个对象(我相信这已经完成了 堆上,所以不需要序列化;这是对的吗?)
这是对的。但同样,你仍然坚持1:1的映射。在序列化(使用缓冲区)方面,性能要差得多。
如果你仍然需要这样的东西,也许你根本不应该使用工作者Verticle,而是像.executeBlocking
这样的东西:
https://github.com/vert-x3/vertx-examples/blob/master/core-examples/src/main/java/io/vertx/example/core/execblocking/ExecBlockingExample.java#L25