代码之家  ›  专栏  ›  技术社区  ›  Jess The Witch

GCP云功能中处理延迟任务的模式

  •  0
  • Jess The Witch  · 技术社区  · 5 月前

    我的问题几乎与(虽然不完全相同,因为Flusher不起作用) How to send response to the client before executing the calculations that are not required in response

    我有一个基于Go的HTTP处理程序Cloud Function,它从设备接收一些数据,然后发回一组配置数据。速度是首要任务,秒有时很重要。构建响应非常快(这只是一个DB拉取)。另外,需要处理接收到的数据,这可能需要大约5分钟的时间。我尝试了链接问题中的模式,在云功能退出之前,客户端不会收到数据。这个 http.Flusher 接口建议“请注意,即使对于支持Flush的ResponseWriters,如果客户端通过HTTP代理连接,则缓冲的数据在响应完成之前可能无法到达客户端。”因此,我认为这就是问题所在。

    是否有其他方法可以调用HTTP云函数,返回响应,然后在等待组执行任务时保持函数活动?我可以强制关闭连接以告诉(假定的)代理继续吗?

    在普通服务器上,我只会将其推迟到处理程序之外,而不用费心等待,但由于运行器在退出时死亡,这不是一种选择。我的另一个想法可能是将数据发送到pubsub,并让一个单独的函数进行处理,但这似乎是浪费,并增加了另一个失败点。

    2 回复  |  直到 5 月前
        1
  •  1
  •   Doug Stevenson    5 月前

    是否有其他方法可以调用HTTP云函数,返回响应,然后在等待组执行任务时保持函数活动?

    不,这不是云函数在任何语言或运行时的工作方式。如果您希望在发送响应后继续处理,则必须将该工作推送到第二个处理单元,该处理单元要么是第二个函数调用,要么是可以通过某些API访问的其他计算产品。

    我可以强制关闭连接以告诉(假定的)代理继续吗?

    不,从功能的角度来看,没有“连接”,只有输入和输出。Cloud Functions只会在函数生成响应的整个有效载荷后发送最终响应。这就是为什么 documentation 规定大小限制为10MB。

    我的另一个想法可能是将数据发送到pubsub,并让一个单独的函数进行处理,但这似乎是浪费,并增加了另一个失败点。

    这实际上正是你应该做的。这在过去已经介绍过了:

        2
  •  0
  •   Jess The Witch    5 月前

    这个 documentation 将此描述为“未定义行为”:

    您的函数必须发送HTTP响应。如果该函数创建后台任务(如线程、期货、JavaScript Promise对象、回调或系统进程),则必须在发送HTTP响应之前终止或以其他方式解决这些任务。在发送HTTP响应之前未终止的任何任务都可能无法完成,并可能导致未定义的行为。

    因此,这种模式可能根本不可能。