Firebase Cloud Functions出站网络请求性能偏慢问题咨询
可能成因及对应解决方案
1. 跨区域物理网络延迟
这是最常见的原因:Cloud Functions部署的区域与你调用的第三方APIapi.sample.com的服务节点区域跨度过大。比如函数部署在美西节点,而API服务器位于亚太区域,单请求跨洋往返本身就有700~900ms的物理延迟,三次串行请求累加后就会出现总耗时超2秒的情况,而你的本地网络环境大概率与API服务节点更近,所以本地运行速度更快。
- 验证方案:查询你当前Cloud Functions的部署区域,以及
api.sample.com的服务器IP所属区域 - 优化方案:将Cloud Functions迁移至与API服务节点同区域的GCP可用区,可直接消除跨区物理延迟。
2. HTTP Keep-Alive配置错误
你当前的Keep-Alive配置存在两个问题,导致完全没有生效:
- 仅给第一个GET请求配置了agent,后续两个POST请求没有复用agent,每次请求都会重新进行TCP三次握手+TLS握手,单次握手就需要200~500ms
- 你调用的API是HTTPS协议,仅配置
http.Agent不生效,需要额外配置https.Agent
修复后的配置示例:
import * as functions from 'firebase-functions' import axios from 'axios' import http from 'http' import https from 'https' // 全局定义可复用的agent,所有请求共用 const httpAgent = new http.Agent({ keepAlive: true }) const httpsAgent = new https.Agent({ keepAlive: true }) // 全局配置axios默认agent,无需每个请求单独配置 axios.defaults.httpAgent = httpAgent axios.defaults.httpsAgent = httpsAgent const headers = { 'accept': 'application/json', 'x-access-key': '...', 'x-access-secret': '...' } exports.functionName = functions.https.onRequest(async (req, res) => { try { console.log('request 1 start') const response1 = await axios.get(`https://api.sample.com/users/${req.body.userId}`, { headers }) console.log('request 1 completed') const response2 = await axios.post(`https://api.sample.com/contents1/${response1.data.id}`, {}, { headers }) console.log('request 2 completed') const response3 = await axios.post(`https://api.sample.com/contents2/${response2.data.id}`, {}, { headers }) console.log('request 3 completed') res.send(response3) } catch (error) { res.send(error) } })
该配置生效后,三次请求会复用同一个TCP连接,可节省2次TLS握手的时间,预估可减少500~1000ms的总耗时。
3. 第三方API对GCP出口IP段限流
很多第三方API服务商会对云厂商的公共出口IP段做QoS限制,对GCP、AWS等云服务的出站请求故意增加延迟或降低优先级,而民用家庭宽带IP段不在限制范围内,就会出现云端请求远慢于本地的情况。
- 验证方案:在与Cloud Functions同区域的GCP云服务器中运行相同代码,若耗时与Cloud Functions侧一致即可确认是该问题
- 优化方案:配置VPC连接器为Cloud Functions绑定固定静态出口IP,联系API服务商将该IP加入白名单即可解除限制。
4. Cloud Functions版本差异
如果你使用的是Cloud Functions第一代,其出站网络吞吐量、DNS解析性能都弱于第二代,也会导致额外的请求延迟。可尝试将函数升级到Cloud Functions第二代,普遍可降低20%~30%的网络请求耗时。
内容的提问来源于stack exchange,提问作者kusumoto_teruya
相关产品推荐
相关产品推荐

