Vertx WebClient 在多个 Verticle 之间共享还是单一?

Posted

技术标签:

【中文标题】Vertx WebClient 在多个 Verticle 之间共享还是单一?【英文标题】:Vertx WebClient shared vs single across multiple verticles? 【发布时间】:2020-12-01 04:56:07 【问题描述】:

我使用 vert.x 作为 api 网关将调用路由到下游服务。

到目前为止,我正在使用单个 Web 客户端实例,该实例在多个 Verticle 之间共享(通过 guice 注入)

每个verticle都有自己的webclient有意义吗?对提高性能有帮助吗? (我的每个网关实例运行 64 个 Vericles,每秒处理大约 1000 个请求)

每种方法的优缺点是什么?

有人可以帮助找出相同的理想策略吗?

谢谢

【问题讨论】:

【参考方案1】:

Vert.x 针对每个 Verticle 使用单个 WebClient 进行了优化。在线程之间共享单个 WebClient 实例可能有效,但它可能会对性能产生负面影响,并可能导致某些代码在“错误”事件循环线程上运行,as described by Julien Viet,Vert.x 的首席开发人员:

因此,如果您在 Verticle 之间共享一个 Web 客户端,那么您的 Verticle 可能会重用以前打开的连接(因为池化)并且您 将在您意想不到的事件循环上获得回调。此外 Web 客户端中的同步可能会变得满足 当从不同的线程集中使用时。

此外,the Vert.x documentation for HttpClient,这是WebClient 使用的底层对象,明确声明不在 Vert.x 上下文之间共享它(每个 Verticle 都有自己的上下文):

HttpClient 可用于 Verticle 或嵌入。

在 Verticle 中使用时,Verticle 应该使用自己的客户端 实例。

更一般地说,一个客户端不应该在不同的 Vert.x 之间共享 上下文,因为它可能导致意外行为。

例如,保持活动连接将调用客户端处理程序 打开连接的请求的上下文,后续 请求将使用相同的上下文。

【讨论】:

vertx 文档还有其他内容。vertx.io/docs/vertx-web-client/java/#_creating_a_web_client. @NitishGoyal 文档说只在应用程序启动时创建WebClient,这是真的。为每个请求创建新请求的成本很高,应该避免。它只是没有说明在线程之间共享它们。但是,我在回答中包含了 Vert.x 首席开发人员关于该主题的建议。 @NitishGoyal 另见此处,在HttpClient 文档中,明确表示不在上下文之间共享:vertx.io/docs/vertx-core/java/#_httpclient_usage

以上是关于Vertx WebClient 在多个 Verticle 之间共享还是单一?的主要内容,如果未能解决你的问题,请参考以下文章

在 Vertx (Vert.x 3) 中异步运行多个 Sql 查询

在vertx中跨顶点共享单例客户端的正确方法

如何使用Spring WebClient同时进行多个调用?

电影「战狼」Chris Collins 带Vertx威特斯棒球帽

如何使用 Spring WebClient 同时进行多个调用?

使用 Spring WebClient 发出多个请求