vert.x - Vertx WebClient 在多个 Verticle 之间共享还是单一?
问题描述
我使用 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 上下文之间共享,因为它可能导致意外行为。
例如,保持活动连接将在打开连接的请求的上下文中调用客户端处理程序,后续请求将使用相同的上下文。
推荐阅读
- javascript - CSS Animation Sidemenu(将其用作表格的过滤器窗格)
- opengl - 在帧缓冲区上绘制后重置 glViewport
- google-sheets - 围绕 Google 表格移动日历事件
- javascript - 每当价格或现金不是整数时,我的收银机功能总是忘记登记最后一分钱
- typescript - 在打字稿中使用对象键作为类型
- java - MongoDB SocketException::连接重置
- regex - Bash Sed 正则表达式 - 如何在不干扰其他 NUMBER:NUMBER 格式的情况下分隔 IP:PORT?
- reactjs - React setState 将数组中的所有项目推送到状态
- c++ - 堆栈结合了pop()和top()?
- python - 如何使用 tweepy 获取超过 7 天的推文