vert.x - 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 线程池也无济于事,因为消费者在回复之前什么都得不到。我想念什么吗?谢谢
解决方案
我从您的问题中得知,DB verticle 是使用一个实例部署的。DB verticle 需要部署为worker。您还可以部署此 Verticle 的多个实例,以便您始终拥有一个可以接受下一个请求的 DB Verticle。
优化建议:如果只是delete action占用这么多时间,把这个action单独放在一个专门的DB Verticle中。通过这种方式,您的系统响应速度更快,并且您能够控制部署了多少 DB-“delecte-action”-Verticles,因此有多少与数据库的连接可能会阻塞更长的时间。
推荐阅读
- soap - WSO2 EI 6.6.0 TenantMgtAdminService 通过代理
- email - SPF 与子域对齐
- c# - 在 IIS 服务器中使用 WCF Soap 发布站点时出错
- ruby - “不建议在全局范围内包含 Capybara::DSL!” 想删除它。控制台警告
- java - Swagger codegen Maven 插件 - 生成 ResponseEntity?
- r - 通过将 0 值分组替换为最后一个已知值,同时保留 NA
- c# - 如何从特定方法中跳过全局动作过滤器
- git - 从mercurial推送时如何解决ssh崩溃?
- c# - 跟踪路由结果
- forms - 如何以 ncurses 的形式移动字段