我使用 vert.x 作为 api 网关将调用路由到下游服务。
截至目前,我正在使用跨多个 Verticle 共享的单个 Web 客户端实例(通过 guice 注入)
每个verticle都有自己的webclient有意义吗?对提高性能有帮助吗?(我的每个网关实例运行 64 个 Vericles,每秒处理大约 1000 个请求)
每种方法的优缺点是什么?
有人可以帮助找出相同的理想策略吗?
谢谢
我使用 vert.x 作为 api 网关将调用路由到下游服务。
截至目前,我正在使用跨多个 Verticle 共享的单个 Web 客户端实例(通过 guice 注入)
每个verticle都有自己的webclient有意义吗?对提高性能有帮助吗?(我的每个网关实例运行 64 个 Vericles,每秒处理大约 1000 个请求)
每种方法的优缺点是什么?
有人可以帮助找出相同的理想策略吗?
谢谢
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 上下文之间共享,因为它可能导致意外行为。
例如,保持活动连接将在打开连接的请求的上下文中调用客户端处理程序,后续请求将使用相同的上下文。