【问题标题】:Firebase cloud function invoked twiceFirebase 云函数调用了两次
【发布时间】:2018-10-02 02:08:48
【问题描述】:

我们有一个使用发布/订阅触发器设置的云功能。

函数被调用topic(NAME).onPublish()

如果函数在冷的时候被调用,它总是运行两次。

Function execution took 284 ms, finished with status: 'ok' METHOD_NAME METHOD_ID
Received message from pub sub METHOD_NAME METHOD_ID
Function execution started METHOD_NAME METHOD_ID

Function execution took 24271 ms, finished with status: 'ok' METHOD_NAME METHOD_ID
Received message from pub sub METHOD_NAME METHOD_ID
Function execution started METHOD_NAME METHOD_ID

之后所有未来的消息只运行一次,直到函数再次变冷。

这是因为第一次调用需要很长时间才能完成并且超时导致它再次运行?有什么办法可以防止这种情况发生?

【问题讨论】:

  • 请编辑您的问题以分享 MCVE。 stackoverflow.com/help/mcve
  • @DougStevenson 对于这种特殊情况,我们需要创建一个发布/订阅队列,然后部署一个订阅发布/订阅队列的云函数。根据天气,超时发挥作用,部署的云功能可能需要很大,需要一段时间才能启动。我不确定如何为这种情况创建 MCVE。
  • @DougStevenson 我希望在功能团队工作的人,或者以前遇到过这个问题的人能够确认长启动时间是否起任何作用。
  • 如果您想直接联系 Firebase 的某个人,请联系 Firebase 支持。 firebase.google.com/support/contact/troubleshooting
  • 我也有同样的问题。它似乎并不总是发生,但经常发生。

标签: firebase google-cloud-platform google-cloud-functions google-cloud-pubsub


【解决方案1】:

启动时间几乎是肯定的问题。要验证这一点,请尝试以下操作:

  1. 注释掉部分函数直到 fast,看看问题是否消失(在本地终端中计时,如果可以,使用 timeit 模块)
  2. 增加Acknowledgement Deadline秒(订阅后);默认为 10,因此很容易出现问题;尝试 20、40 等
  3. 确保第一次运行时,函数花费的时间少于函数的 Timeout 值(默认为 60 秒 - 不太可能是问题)

【讨论】:

  • Acknowledgement Deadline 设置为 300 秒。您对默认值是正确的,它是 10s,看起来云功能在创建订阅时设置为 300。所以这不是问题。
  • 发布/订阅主题推送到 appspot.com(应用引擎)端点。 300 秒的最后期限适用于此请求。我不确定该 apppot url 是否在内部路由到部署的云功能,或者是否有一个应用引擎应用程序将请求转发到云功能。知道它在内部是如何工作的吗?
  • 第一次运行时间不超过60秒,总是小于30秒。
  • @precedurallygenerated 你试过第 1 项了吗
  • 你能解决这个问题吗?我对 .onPublish 也有类似的问题...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 2016-10-07
  • 2021-09-13
  • 2020-08-08
  • 1970-01-01
相关资源
最近更新 更多