【发布时间】: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