通过Firebase托管代理的Https函数的网关超时

时间:2018-05-25 00:01:52

标签: firebase google-cloud-functions firebase-hosting

问题:

我们正在使用花费超过60秒的Https函数来响应(这是我们用例的必要条件,不能用异步执行代替)。我们将函数配置为超时,以便它们在例如75秒,如通过Chrome或Postman直接执行,例如https://us-central1-<project-id>.cloudfunctions.net/test

我们还配置了托管代理,以便将/api的所有请求重写为这些功能。但是,当通过这些“托管”端点(例如https://<project-id>.firebaseapp.com/api/test)提交相同的请求时,我们会在Chrome和Postman中仅在60秒后收到504(网关超时)错误。这表明托管代理本身超时 功能成功 仍然会发生,如Firebase控制台日志中所示)。

问题:

是否可以将主机超时设置为更高的值(例如120秒)?

可能的解决方案/解决方法:

  • 尝试在客户端请求中设置Connection: keep-aliveKeep-Alive: timeout=120标头,但这似乎对托管代理没有任何影响;或许我们做得不对。
  • 目前唯一的解决方法是不使用重写规则,而是依赖“直接”网址(来自cloudfunctions.net)。但是,这需要在浏览器客户端中处理CORS,更重要的是,更改我们的URL解析方案和函数代码的组织(例如,我们不能为每个函数使用长路径,例如/api/some/path/to/test,因为只有第一部分该路径(例如api)将被视为函数名称。

谢谢!

2 个答案:

答案 0 :(得分:0)

可以以保持持久连接的方式编写函数:

https://firebase.google.com/docs/functions/networking#https_requests

const http = require('http');
const functions = require('firebase-functions');
const agent = new http.Agent({keepAlive: true});

exports.function = functions.https.onRequest((request, response) => {
    req = http.request({
        host: '',
        port: 80,
        path: '',
        method: 'GET',
        agent: agent,
    }, res => {
        let rawData = '';
        res.setEncoding('utf8');
        res.on('data', chunk => { rawData += chunk; });
        res.on('end', () => {
            response.status(200).send(`Data: ${rawData}`);
        });
    });
    req.on('error', e => {
        response.status(500).send(`Error: ${e.message}`);
    });
    req.end();
});

答案 1 :(得分:0)

刚刚遇到了一个与我的 API 端点(通过 Firebase 托管连接)的 Cloud Scheduler 作业相同的问题。大约需要 80 秒才能完成。

但似乎没有解决方法。至少在使用 Firebase 托管时不会。也许您可以直接点击函数的 URL,而不是通过 Firebase 托管。但是,如果这些请求来自浏览器,则您必须处理配置 CORS。

发件人: https://firebase.google.com/docs/hosting/functions

enter image description here

文字版:

<块引用>

注意:Firebase 托管受 60 秒请求超时的影响。即使您将 HTTPS 函数配置为更长的请求超时,如果您的函数需要超过 60 秒的运行时间,您仍会收到 HTTPS 状态代码 504(请求超时)。要支持需要较长计算时间的动态内容,请考虑使用 App Engine 柔性环境。