在 PubSub 主题上使用 Cloud Run

Posted

技术标签:

【中文标题】在 PubSub 主题上使用 Cloud Run【英文标题】:Using Cloud Run on a PubSub topic 【发布时间】:2019-11-16 01:25:35 【问题描述】:

我不清楚如何 来执行中等运行任务(当然,在 Cloud Run 的时间限制内。)

让我们看看这个取自教程[1]的例子:

app.post('/', (req, res) => 

  if (!req.body) 
    const msg = 'no Pub/Sub message received'
    console.error(`error: $msg`)
    res.status(400).send(`Bad Request: $msg`)
    return
  
  if (!req.body.message) 
    const msg = 'invalid Pub/Sub message format'
    console.error(`error: $msg`)
    res.status(400).send(`Bad Request: $msg`)
    return
  

  const pubSubMessage = req.body.message
  const name = pubSubMessage.data
    ? Buffer.from(pubSubMessage.data, 'base64').toString().trim()
    : 'World'

  console.log(`Hello $name!`)
  res.status(204).send()
)

我的疑问是:它是否应该仅在任务完成后返回 HTTP 204,否则任务会突然终止?

1 - https://cloud.google.com/run/docs/tutorials/pubsub

【问题讨论】:

【参考方案1】:

我的疑问是:它是否应该仅在任务完成后才返回 HTTP 204, 否则任务会突然终止?

您别无选择。如果您在任务/目标完成之前返回,CPU 将空闲到零,并且您的 Cloud Run 实例不会发生任何事情。

在您的示例中,您只是在处理发布/订阅消息并提取名称。如果您在完成之前返回,则不会处理任何名称。

Cloud Run 专为 HTTP 请求/响应系统而设计。这意味着处理在您收到 HTTP 请求(GET、POST、PUT 等)时开始,并在您的代码返回 HTTP 响应(或仅返回没有响应)时结束。您可能会尝试创建后台线程,但不能保证它们会在您的主函数返回后执行。

【讨论】:

以上是关于在 PubSub 主题上使用 Cloud Run的主要内容,如果未能解决你的问题,请参考以下文章

排空或清除 Google Cloud pubsub 主题的最佳做法 [关闭]

来自 PubSub 主题的 Google Cloud 函数触发器是订阅吗

Firebase Emulator Cloud Functions + PubSub 订阅生产主题

如何使用 Node.js 控制 Cloud PubSub 中的确认

PubsubFileInjector 无法提交到 PubSub 主题

如何使用 Google Cloud PubSub 和 Run 处理资源密集型长时间运行的任务?