【发布时间】:2020-07-09 10:10:33
【问题描述】:
我有一个小的 vertx 应用程序。 http verticle 获取请求并通过事件总线以请求-响应模式发送它。所以像:
vertx.eventBus().request(queue, request, options, reply -> {
if (reply.succeeded()) {
JsonObject body = (JsonObject) reply.result().body();
context.response().end(body.encode());
} else {
JsonObject result = new JsonObject().put("errorMessage", reply.cause().getMessage());
context.response().end(result.encode());
}
});
在 DB Vertical 中,我使用消费者获取消息以转到 DB,进行一些更改并发送回 HTTP verticle。 我的问题是,我有一个必须进行大量检查的删除操作,因此此过程最多可能需要 10 秒。此时 HTTP verticle 仍然可以获得一些新的请求,但是 DB 消费者在删除操作完成之前不会收到任何内容。所以没有请求被处理。唯一有帮助的是将多线程设置为 DB verticle 并且已被贬低。围绕 DB 执行的 Vertx.executeBlocking 或 JAVA 线程池也无济于事,因为消费者在回复之前什么都得不到。 我想念什么吗? 谢谢
【问题讨论】:
-
DB Verticle 是否部署为工作者?创建了多少个实例?
-
DB 是具有 1 个实例的工作者。我虽然 setmultithreaded 可以以某种不同的方式实现,因为在 DB verticle 开始时会发生一些初始化过程。所以如果我启动 10 个实例,那么我需要 10 次初始化进程
-
如果你创建了 10 个独立的实例,那么你就不需要一个数据库连接池,或者?
-
你也可以在你的工作节点之间共享一个数据库池
-
提供你的数据库verticle,你也可以在创建verticle实例时共享数据源:DataSource ds = ... ;// init datasource vertx.deployVerticle(() -> new DbVerticle(ds), .. .);
标签: vert.x