从阻塞单体中的反应式数据库访问开始

starting with reactive DB access in a blocking monolith

在基于 wildfly 的 DB 重型单体中。对于初学者来说,将数据库访问转换为反应式访问是否有意义?我应该看到性能优势吗?

此外,数据库是 sybase,我知道的唯一 'generic' jdbc 驱动程序来自 vert.x 但这意味着我必须将 vert.x 放入我的野蝇。我知道它们是某种替代品,但我找不到任何其他选择。

我很想听听您对我提出的两点的看法。总的来说,我不能承诺从一开始就从 wildfly 完全过渡到 quarkus/vert.x,因为它会占用大量资源,所以我想我可以从小一点开始......

Vert.x 是一个 工具包 ,这意味着,例如,您不需要使用它提供的 Web 服务器,也不需要任何其他模块。它还非常轻量级,因此您只需向您的应用程序添加几个依赖项。所以,是的,整合 Vert.x.

是有意义的 然而,

vertx-jdbc-client 无法神奇地将阻塞调用转换为 non-blocking 调用。相反,它将 off-load 阻塞调用 Vert.x' 工作线程池 。这将导致另一个影响:DB 调用您 用于等待 ,将立即 return,只留下一个 Future。那个 Future 最终 会得到预期的结果。

在你的代码中上游更进一步(你的用户请求的方向),这意味着你将不得不

  1. 通过 Future.map()Future.compose()
  2. 延迟处理结果
  3. 阻塞线程立即得到结果

(2) 你将一无所获,所以排除它。

当您选择 (1) 时,您必须推迟所有进一步的处理,直到最初处理传入请求的那一点。例如,如果是 Servlet,您必须使用 Asynchronous Processing 来确保 Wildfly 在 doGetdoPost 等方法退出后不会提交响应.

所有这一切的结果将是 Wildfly 现在异步处理您的请求,Vert.x 管理数据库交互。 你可以做到。但对于您当前的设置来说,仅使用异步处理(或 Spring 的 @Async 功能)并将所有代码包装在 Runnable 中会更加惯用。这两种方法都不会加速请求处理本身,因为处理依赖于较慢的数据库。但是,Wildfly 将能够处理更多请求,因为它分配给请求的线程将不再被阻塞。

综上所述,如果您想逐步迁移到 Quarkus,您应该逐个服务。确定执行工作的 Servlets(或 Controllers),并将它们一一移植到 Quarkus。如果会话是您的问题,那么您可以使用 Infinispan 在 Wildfly 和 Quarkus 之间共享它们。