【问题标题】:Gateway timeout for Https Functions proxied through Firebase Hosting通过 Firebase 托管代理的 Https 函数的网关超时
【发布时间】:2018-05-25 00:01:52
【问题描述】:

问题:

我们使用的 Https 函数响应时间超过 60 秒(这是我们用例的必要要求,不能用异步执行代替)。我们配置了函数超时,以便它们在例如之后成功。 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 标头,但这似乎对托管代理没有任何影响;或者我们做的不对。
  • 目前唯一的解决方法是不使用重写规则,而是依赖“直接”URL(来自cloudfunctions.net)。但是,这需要在浏览器客户端中处理 CORS,更重要的是,更改我们的 URL 解析方案和函数代码的组织(例如,我们不能为每个函数使用长路径,例如 /api/some/path/to/test,因为只有第一部分路径,例如api,将被视为函数名)。

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    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();
    });
    

    【讨论】:

    • 我认为问题在于托管本身,而不是云功能。此外,该文档是否与从函数访问外部 API 相关,而不是调用函数的服务器本身?
    • @dinvlad 文档有点不清楚:“下面的优化代码 sn-p 显示了如何维护持久连接,而不是在每次函数调用时创建新连接。”
    【解决方案2】:

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

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

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

    文字版:

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

    【讨论】:

    • 那是正确的 - 我们也必须切换到使用 CORS 的直接请求:-/ 至少,现在这是记录在案的行为..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多