首页 > 解决方案 > Vertx EventBus 被阻塞

问题描述

我有一个小的 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 线程池也无济于事,因为消费者在回复之前什么都得不到。我想念什么吗?谢谢

标签: vert.x

解决方案


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

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


推荐阅读