首页 > 解决方案 > Vertx WebClient 在多个 Verticle 之间共享还是单一?

问题描述

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

截至目前,我正在使用跨多个 Verticle 共享的单个 Web 客户端实例(通过 guice 注入)

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

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

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

谢谢

标签: vert.xvertx-verticlevertx-httpclientvert.x-webclient

解决方案


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

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

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

HttpClient 可以在 Verticle 中使用或嵌入。

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

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

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


推荐阅读