【问题标题】:Vertx EventBus blockedVertx EventBus 被阻塞
【发布时间】: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


【解决方案1】:

我从您的问题中得知,DB verticle 是使用一个实例部署的。 DB verticle 需要部署为worker。您还可以部署此 Verticle 的多个实例,以便您始终拥有一个可以接受下一个请求的 DB Verticle。

优化建议:如果只是delete action占用了这么多时间,把这个action单独放在一个专门的DB Verticle中。通过这种方式,您的系统响应速度更快,并且您能够控制部署了多少 DB-“delecte-action”-Verticles,因此有多少与数据库的连接可能会阻塞更长的时间。

【讨论】:

    猜你喜欢
    • 2021-09-22
    • 1970-01-01
    • 2016-06-11
    • 2019-04-10
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多