首页 > 解决方案 > Cloud Run 出站 API 调用受到限制?

问题描述

我有一个实例,在某些请求中需要多次调用外部 API,有时最多调用 2,000 多次。

在本地运行我的应用程序时,每次对外部 api 的调用每次都以低于 200 毫秒的速度返回,并且所有 2,000 次调用的整个过程需要大约 15 秒。

我注意到在云上运行时,我的 API 调用分为三类:appx 1/4 与本地相同,耗时约 200 毫秒。大约 1/2 正好需要 12007 毫秒,有些正好需要 63000 毫秒,对于这些相同的 API 调用,整个过程需要 20 多分钟。

我尝试过批处理,使用 async/eachLimit 设置为 10、20、50 .. 但同样的事情发生了。

我本地的端点、数据和调用与云上运行的相同。云运行也通过具有静态 IP 的 NAT 运行(可能是拦截/节流?)。

有没有人遇到过这个?将我的 docker 映像添加到同一 VPC/NAT 网关中的 VM 与我的本地效果相同(所有调用 < 200 毫秒,完成时间 < 15 秒)。

有没有人在跑步中遇到过这种情况以及如何解决?

片段运行(注意我玩过限制(下面片段中的 50):

const productsWithAvailabilities = await mapLimit(products, 50, async product => {
      console.time(product.ProductID)
      const availabilityOther = await productClient.execute(
        'GetAvailabilityA',
        {
          productid: product.ProductID,
          viewid: 'WEB',
          connectid: this.pricingToken,
        },
        false,
      )

      let AvailabilityOther

      try {
        AvailabilityOther = availabilityOther?.GetAvailabilityAResult?.diffgram?.Warehouses?.ProductAvailability?.map(
          a => ({
            ...a,
            QtyAvail: parseFloat(a.QtyAvail),
            QtyOnHand: parseFloat(a.QtyOnHand),
            QtyOnOrder: parseFloat(a.QtyOnOrder),
            QtyInTransit: parseFloat(a.QtyInTransit),
            Available: parseFloat(a.QtyAvail),
          }),
        )
      } catch (e) {
        console.log({ product, e })
      }

      console.timeEnd(product.ProductID)
      return {
        ...product,
        AvailabilityOther,
        Availability: AvailabilityOther?.find(a => a.LocationID === LOCATIONS.MEL),
        QtyAvailableOther: AvailabilityOther?.filter(a => a.LocationID !== LOCATIONS.MEL)
          .map(a => a.QtyAvail)
          .reduce((result, current) => result + current, 0),
      }
    })

    console.timeEnd('availabilities')
    return productsWithAvailabilities as MoProProduct[]
  }

ProductClient.execute 正在使用节点“soap”库发出 SOAP 发布请求。

VPC 连接器吞吐量为 200 - 1000(默认设置),并且我有一个连接到 NAT 的外部 IP/路由器。

标签: google-cloud-run

解决方案


推荐阅读