错误 429:超出配额指标 'Queries' 和限制 'Queries per minute per user' 的配额

Error 429: Quota exceeded for quota metric 'Queries' and limit 'Queries per minute per user'

我们将一项服务从 GCP App Engine 迁移到了云端 运行。此服务已连接到云 SQL。

其参数为:

收到尖峰信号后,我们多次遇到此错误:

Cloud SQL connection failed. Please see https://cloud.google.com/sql/docs/mysql/connect-overview for additional details: googleapi: Error 429: Quota exceeded for quota metric 'Queries' and limit 'Queries per minute per user' of service 'sqladmin.googleapis.com' for consumer 'project_number:370240628xxx'., rateLimitExceeded

Cloud SQL Admin API 中的配额每个用户每分钟查询 设置为 180。所以这显然是失败的地方。

我发现由于 Cloud 运行 连接到 Cloud SQL 实例的方式,达到了配额限制。正如 this link 所说:

The native connection leverages the Cloud SQL Auth proxy which in turns makes requests to the Cloud SQL Admin API. This API - like all GCP APIs - has throttling quotas which will prevent containers from starting once reached.

同一网站上的教程建议使用 VPC 连接器而不是普通的云 SQL 连接。但是我以某种方式看到了 Google 的 docs and other Whosebug posts suggesting adding quotaUser 参数。

最佳解决方案是什么?我通常会选择 VPC,但由于这是一项付费服务​​,我显然会尽量避免这种情况。由于我已经为 Cloud 运行 和 Cloud SQL 付费,我希望这两者能够毫无问题地连接起来,并且不会产生额外费用。

感谢您的所有提示和帮助!

max requests per container: 1
min instances: 0
max instances: 200

哇,好奇怪的设置。

以上表示你的concureny=1。对于每个请求,您都会启动一个全新的容器。您的所有请求都启动缓慢。

您应该将 max requests per container 增加到您的容器基于其运行的进程可以跟上的阈值,例如:80 request/container 对于具有 512MB 的简单网络服务听起来不错。试验一下。

将并发数从 1 增加到 80,这意味着可以重复使用 1 个数据库连接,并且不会达到其他限制。

ps。我不知道您可以为 SQL 连接指定 quotaUser 的任何方法,这是一个 unix socket 类型的连接。

简短说明:

我们通过使用允许我们创建内部网络的 VPC 无服务器连接器(VPC 网络 -> 无服务器 VPC 访问)解决了这个问题。

“每位用户每分钟查询”配额适用于云 SQL 管理员 API。由于我们现在使用内部网络,因此我们不会达到此 API 及其限制。

步骤:

  1. 注册一个新的VPC无服务器连接器。可以在VPC网络->无服务器VPC访问中找到。我们选择“默认”网络,将 IP 地址范围设置为“10.8.0.0/28”,并将“e2-micro”设置为实例类型。关于区域,我们指定了“europe-west1”,因为我们的 Cloud 运行 服务位于那里。正如 Google documentation 所说,VPC 的区域必须与您的服务区域匹配才能工作。
  2. 您必须为您的 SQL 启用“私有 IP”。它可以在 SQL -> 连接中找到。我们选择“默认”网络并选择 Google 为我们生成地址。 Google 花了几秒钟完成这个过程。
  3. 然后,要设置这些设置,您必须按“保存”按钮,但是请小心,因为接下来的过程需要几分钟才能完成(我们的 7 分钟例)
  4. 我们去 SQL -> Overview 并复制了新生成的“私有 IP 地址”。
  5. 然后,我们将此地址用作我们 Cloud 运行 中的环境变量,如 SQL_HOST。之前,SQL_HOST 变量改为“连接名称”,其形式为“项目名称:欧洲西部 3:数据库名称”。所以这被替换为“私有IP”。

它起作用了,尽管我们认为 Google 应该默认这样做。云 运行 应该是一种可以扩展到高数量的服务,但您很快就会发现流量增加会导致问题。

更新:

我们最终创建了一个新的 VPC 网络,仅用于从云 运行 服务到数据库的连接。因此,我们将数据库和无服务器 VPC 连接器分配给这个新创建的网络,而不是“默认”。这样我们就可以轻松地修改我们想要允许的 IP 地址数量,而不会干扰网络中的其他机器。