【问题标题】:First Invocation of Google Cloud Function always times out首次调用 Google Cloud 函数总是超时
【发布时间】:2020-02-05 03:41:18
【问题描述】:

我有一个谷歌云功能,在闲置一段时间或重新部署后似乎超时。对端点的后续调用工作正常,只是初始调用不起作用。以下是我的云功能的过度简化版本。我基本上使用快速应用程序作为处理程序。也许问题在于 express 应用程序不是第一次运行,而是在后续调用中运行?

const express = require('express');
const app = express();

const cors = require('cors');

app.use(cors())

app.get('/health', (req, res) => {
  res.send('OK');
});

module.exports = app;

目前已设置为 60 年代,像健康路线这样的路线应该不会花那么长时间。

一些有趣的日志条目

"Function execution took 60004 ms, finished with status: 'timeout'" 
textPayload: "Error: Retry total timeout exceeded before any response was received
    at repeat (/srv/functions/node_modules/google-gax/build/src/normalCalls/retries.js:80:31)
    at Timeout.setTimeout [as _onTimeout] (/srv/functions/node_modules/google-gax/build/src/normalCalls/retries.js:113:25)
    at ontimeout (timers.js:436:11)
    at tryOnTimeout (timers.js:300:5)
    at listOnTimeout (timers.js:263:5)
    at Timer.processTimers (timers.js:223:10)" 

【问题讨论】:

  • Google Functions 的冷启动非常缓慢。函数的超时时间是多少?
  • 60 秒。
  • 没有 cors 的行为是否相同?
  • 我可以尝试删除该中间件,但我希望它会是一样的。
  • 这是你的整个程序吗?如果您在 60 秒后超时,则说明发生了其他事情。请在您的问题中提供更多详细信息。包括来自 Stackdriver 的日志。

标签: express google-cloud-platform google-cloud-functions serverless


【解决方案1】:

可以将 Google Cloud 函数视为传入事件请求的事件处理程序。可以从 REST 请求、发布/订阅或云存储触发云功能。对于 REST 请求,请将您提供的函数视为该函数提供的唯一“处理程序”。

您提供的代码(假设是 Node.JS)是一个在快速请求对象和响应对象中传递的函数。在函数体中,您负责处理请求。

具体来说,您的 Cloud Function 不应设置 express 或尝试以其他方式修改环境。 Cloud Function 提供要在外部调用的环境,您提供要调用的逻辑。其他一切(缩放等)均由 Google 处理。

【讨论】:

  • 您好,Kolban,感谢您的回复。我使用 express 作为处理程序,我没有尝试修改环境(我没有使用应用程序来监听请求),只是处理请求(因为 express 应用程序本质上需要一个请求对象和响应对象,正如谷歌函数所期望的那样。我会理解它是否每次都不起作用,但它只是在第一次调用时不起作用。
【解决方案2】:

云函数执行时间受超时时间限制,您可以在函数部署时指定。默认情况下,函数在 1 分钟后超时。 正如official documentation中所述:

当函数执行超过超时时间时,立即向调用者返回错误状态。超时函数实例使用的 CPU 资源受到限制,请求处理可能会立即暂停。暂停的工作可能会或可能不会继续处理后续请求,这可能会导致意外的副作用。

请注意,这段时间最多可以延长 9 分钟。为了设置函数超时限制,你可以使用这个 gcloud 命令:

gcloud functions deploy FUNCTION_NAME --timeout=TIMEOUT FLAGS...

有关您的选项的更多详细信息,请访问here。 但是,如果您的代码需要很长时间才能执行,您也可以考虑使用另一个无服务器选项,例如 Cloud Run

【讨论】:

  • 问题实际上是为什么它需要这么长时间和超时,而不是它超时的事实。函数的启动时间不能超过 60s。
  • 如果这是您正在使用的所有代码并且仍然面临同样的问题,您可以考虑打开支持票 - cloud.google.com/support 进行更深入的调查,因为我复制了您的情况并且我没有面临您面临的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 2020-08-17
  • 2021-04-24
  • 1970-01-01
  • 2018-08-30
相关资源
最近更新 更多