我们正在为应用程序使用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天发生一次,但随后会重复每封电子邮件。
有什么想法吗?
感激。
答案 0 :(得分:1)
如果重复“每条消息”,也许是您的“ cronPublisher”函数被调用了两次? Cloud Pubsub至少提供一次语义,因此您的工作应容忍此https://cloud.google.com/pubsub/docs/subscriber#at-least-once-delivery。
如果您要在Firebase事务中保留一些已收到此Cron事件的信息,并在发布之前进行检查,则可以防止重复发布到“发送电子邮件”主题。