Firebase发布/订阅触发器:偶尔执行多次

时间:2018-11-14 20:03:12

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

我们正在为应用程序使用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
});

我遇到的问题是第二个主题触发器有时多次执行,发送两封相同的电子邮件。我通过Google遇到的主要潜在原因只是执行时间长,导致超时和重试。 这不是情况,因为我们的确认超时配置为300秒,执行时间绝不超过〜12秒。

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

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

有什么想法吗?

感激。

1 个答案:

答案 0 :(得分:1)

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

如果您要在Firebase事务中保留一些已收到此Cron事件的信息,并在发布之前进行检查,则可以防止重复发布到“发送电子邮件”主题。