0

嘿,溢出者!

我正在开发一个小型应用程序,每次将消息发布到 PubSub 主题时都会触发云函数。函数内的代码工作(显然)很好,但我正在尝试发布过程中的一些问题。

出于某种原因,当发布消息时,来自 Cloud Function 的警告日志会返回:“POST 429 [...] The request was aborted because there is no available instance”

如果有人可以提供帮助,我想知道它的含义以及如何处理它。我不确定如何从我的代码中解决这个问题。

感谢大家!

编辑:函数内存限制为 256MB,超时 60 秒。

编辑 2:我已经测试过删除实例限制,但服务一直失败(返回 POST 500 或 POST 429 错误)。

我还有一个问题,我的云函数有时会返回超时。我很确定问题的根源在于 PubSub,即之前提到的那个,这些 CF 对应于失败的 POST 请求。在大多数情况下,函数在时间范围内正确执行。

我的问题:如果消息一开始没有正确发布(也许它被重试?),为什么这些函数会被执行,更重要的是,为什么这些函数会达到它们的超时限制(它们不应该在消息发布之前触发正确,对吧)?

编辑 3:我一直在阅读 Google Cloud Functions 文档,发现我的问题已经记录在这里:https ://cloud.google.com/functions/docs/troubleshooting#scalability

正如纪尧姆所说(再次感谢!),这似乎是一个扩展问题。这些函数被触发得如此之快,以至于它们没有足够的时间来扩展实例。我将尝试处理传入消息的流,使其在加速时变慢。

本节的注释也可以提供帮助: https ://cloud.google.com/functions/docs/concepts/exec#auto-scaling_and_concurrency

注意:入站流量的极快增长可能会间歇性地导致某些请求失败,HTTP 代码为 500。这是因为请求在等待创建新实例时在挂起队列中超时。配置您的工作负载,使其在一分钟内逐渐增加流量可以帮助解决此问题。另请参阅云功能故障排除了解更多信息。

再次感谢大家!

4

1 回答 1

0

您已将 Cloud Functions 创建限制为 4 个实例。Cloud Functions 一次只能处理 1 个请求(在您的情况下为 1 条消息)。

因此,如果您在 PubSub 中同时有 4 条以上的消息,则会出现此 429 HTTP 错误。

但是,如果您的用例对时间不敏感,这不是问题。在您的 Cloud Functions 部署中激活重试,稍后将重试该消息。

如果您希望尽快处理消息,请考虑增加 Cloud Functions 最大实例限制,或使用接受并行处理的产品(例如 Cloud Run 和 App Engine)

于 2021-10-09T18:30:06.497 回答