dar*_*rse 2 python google-cloud-functions
我正在使用 Google Cloud Functions 运行一个 Python 函数,该函数正被我的 Facebook Messenger 机器人攻击。Facebook Messenger 有一个奇怪的要求:
当您收到 webhook 事件时,您必须始终返回 200 OK HTTP 响应。Messenger 平台将每 20 秒重新发送一次 webhook 事件,直到收到 200 OK 响应。未能返回 200 OK 可能会导致您的 webhook 被 Messenger 平台取消订阅。
换句话说,我有 20 秒的时间从我的云函数返回 200 OK 响应。问题是我需要使用 a 将我从消息中收到的数据实际发送到另一个 API requests.post,并且基本上不能保证它会花费少于 20 秒。所以理想情况下,我想使用线程和多处理。我意识到谷歌不允许线程。有什么办法可以处理这种情况?谢谢。
如果我理解正确,我们有一个原始的 REST 调用者 (Facebook),它需要在 20 秒或更短的时间内做出响应。但是,处理请求的函数希望调用可能需要超过 20 秒才能响应的服务。一种可能的解决方案是实现原始 Cloud Function 发送的响应甚至可以在 Cloud Function 中的代码逻辑完成之前返回。假设您在 Node.js 中编码,您会收到一个响应对象给 Cloud Function。您可以在 Cloud Function 主体内对该对象调用 send() 和 end(),然后继续并完成其他长期运行的工作。如果您想将整个流程的成功标准返回给最初的来电者,听起来我们有一些相互矛盾的故事。合同似乎说响应必须是 20 秒或更短,而工作可能需要 20 秒以上。因此,您无法在所有情况下明智地返回指示完整结果的响应。
如果您使用 Python 编写应用程序,事情就没有那么简单了。利用 Python 的 Cloud Functions 基于烧瓶,而在烧瓶中,会调用 Python 函数(由您提供)。这个函数返回的数据就是返回给调用者的数据。如果我们想早点返回然后做额外的工作,这里描述了一个食谱。不幸的是,我们似乎无法利用这个故事,因为 Cloud Functions 拥有并管理 Flask 环境,而且我们没有合法的方式来添加额外的处理程序。
我想到的另一个想法是让 Facebook 调用的 Python 代码现在在 Cloud Functions 中运行,执行 Google Pub/Sub 发布请求,传递您需要传递的数据。此发布将立即返回,然后您可以快速从 Cloud Function 返回并满足原始请求。然后可以使用发布的消息来触发第二个云功能,只要它需要完成,就可以使用该功能。
另一个想法是根本不使用 Cloud Functions。您很有可能使用 Cloud Functions 来实现无服务器编码,而不必担心扩展问题。现在可以使用一项名为 Cloud Run 的新功能(从 Next 19 开始),它允许您创建一个可以运行您自己的 Flask python 应用程序的 Docker 容器,然后您就可以完全控制环境。我们所拥有的似乎是一种权衡。我们有 Cloud Functions,它提供了一种超快速机制来处理绝大多数 REST 请求……但是,如果我们需要专业化(必须在 20 秒或更短的时间内做出响应并进行后续工作),那么 Cloud Function 可能已经提示如果我们想要实现一些自定义处理,就会成为障碍。