【问题标题】:Firebase Pub/sub trigger: executing multiple times sporadicallyFirebase Pub/sub 触发器:偶尔执行多次
【发布时间】:2019-04-17 21:03:09
【问题描述】:

我们将 Firebase 用于我们的应用程序,该应用程序需要处理一些数据,然后在确定数据后发送一系列电子邮件。

现在我正在通过 CRON(使用 pub/sub)触发一个处理程序,该处理程序处理数据,然后将一系列消息发布到不同的 pub/sub 主题。该主题又具有类似的触发功能,该功能会经过几个流程,然后每次执行发送一封电子邮件。

// Triggered by CRON task
const cronPublisher = functions.pubsub.topic('queue-emails').onPublish(async () => {
   //processing
   ... 
   // Publish to other topic
   await Promise.all(
     emails.map((email) =>
        publisher.queueSendOffer(email)
     )
  );
});

// Triggered by above, at times twice
const sendEmail = functions.pubsub.topic('send-email').onPublish(async () => {
   //processing and send email
});

我遇到的问题是第二个主题触发器有时被执行了不止一次,发送了两封相同的电子邮件。我通过谷歌遇到的主要潜在原因只是执行时间长,导致超时和重试。 不应该是这种情况,因为我们的确认超时配置为 300 秒,并且执行时间永远不会超过 ~12 秒。

此外,Firebase 界面似乎无法让您控制此确认的发送方式。

此 CRON 函数每天运行,问题仅每 4-5 天发生一次,但随后它会重复每封电子邮件。

有什么想法吗?

赞赏。

【问题讨论】:

  • Cloud Functions 不会为您的函数执行提供完全一次的保证。它为您提供了至少一次保证,这意味着您的函数可能会多次执行,但这应该很少见。在任何情况下,您的函数都应该是“幂等的”——能够抵抗被多次调用。如果某些工作已经完成,您可能必须将一些数据保存在数据库中以确保您的函数能够执行。
  • 是的,我预计这里和那里可能会出现奇怪的情况,但这个问题绝对不符合那个描述。每隔这么多天,每条消息都会重复。我希望我需要重新考虑一下架构,但我正试图准确了解正在发生的事情。
  • 嘿,Doug,支持您所说的至少一次保证的文档在哪里,这意味着它可能会被执行多次?
  • 如何使 pub 子函数原子化?

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


【解决方案1】:

如果“每条消息”都重复,可能是您的“cronPublisher”函数被调用了两次? Cloud Pubsub 至少提供一次语义,所以你的工作应该容忍这个https://cloud.google.com/pubsub/docs/subscriber#at-least-once-delivery

如果您要在 firebase 事务中保留已收到此 cron 事件的一些信息,并在发布之前检查这些信息,您可以防止重复发布到“send-email”主题。

【讨论】:

  • 我想到了,但日志表明 cronPublisher() 函数只执行一次;因此混乱。很好的交易电话,我可能会朝那个方向走。
猜你喜欢
  • 2021-02-21
  • 2019-02-25
  • 2021-07-29
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 2019-12-26
  • 2018-06-14
  • 2021-12-27
相关资源
最近更新 更多