【问题标题】:Limit concurrent queries in Spring JPA在 Spring JPA 中限制并发查询
【发布时间】:2021-11-24 04:06:02
【问题描述】:

我有一个执行 Postgres 过程的简单休息端点。 此过程返回设备的当前状态。 例如: 20 台设备。 客户端应用程序连接到 API 并每秒对该端点做出 20 次响应。 对于 x 个客户端,有 x*20 个请求。 对于 2 个客户 40 个请求。 仅当有许多客户端和/或许多设备时,它才会在 Postgres 服务器上导致较大的 cpu 负载。 我没有创建它,但我需要重新设计它。 如何仅将并发查询限制为 db?这将是一个热修复。

我的第二个想法是创建一个在同一时间只执行一个查询的后台工作者。然后端点从内存中获取数据。

【问题讨论】:

  • 您可以减小连接池的大小 - 这实质上定义了您的应用程序可以运行的并发查询数
  • 为什么不直接修复客户,让他们停止这样做呢?如果每 5 个请求中有 4 个开始抛出错误,客户端将如何响应?如果你让每个客户都等待它的回答,客户会如何回应?您可以在对客户说“嘿,把它关闭”的响应中添加一个字段,但除非客户知道这意味着什么,否则它不会改变任何东西。
  • 为什么不尽可能使用原生查询?

标签: spring postgresql spring-data-jpa spring-data


【解决方案1】:

我会先尝试简单的方法。尽量减少

  1. 池中的数据库连接数量或
  2. 内置 Tomcat 中的工作线程数。

更灵活的选择是将逻辑放在限制工作线程数量的线程池后面。如果在工作人员内部使用 Spring 上下文和数据库,这并非易事。看一下Spring注解@Async。

题外话:我们在这里讨论的解决方案看起来像是一种解决方法。单独讨论的解决方案很可能只会将吞吐量提高 2 倍或 3 倍。它不符合 JEE 标准,而且很可能不是很稳定。最好重构应用程序以避免此类问题。另一种选择是购买新的数据库服务器。

更新: 符合 JEE 的解决方案是实施某种隔板模式。如果达到某个关键数量,它将限制并发运行请求的数量并拒绝它。服务器应用程序回答“503 Service Unavailable”。客户端应用程序捕获此状态并在一秒钟后重试(请参阅“指数退避”)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    相关资源
    最近更新 更多