我正在使用
Cloud-Functions
来跟踪当前经过身份验证的用户数量(以获取 实际用户数)。
这些是我的职能:
exports.accountCreate = functions.auth.user().onCreate((user) => {
console.log(user.uid);
const userCounterRef = admin.firestore().collection("data").doc("userCounter");
return userCounterRef.update({
userCounter: admin.firestore.FieldValue.increment(1),
});
});
exports.accountDelete = functions.auth.user().onDelete((user) => {
console.log(user.uid);
const userCounterRef = admin.firestore().collection("data").doc("userCounter");
return userCounterRef.update({
userCounter: admin.firestore.FieldValue.increment(-1),
});
});
我测试了它,它似乎工作正常,但过了一会儿,
userCounter
与我在 Firebase 仪表板中看到的值不同。
怎么可能呢?我完全不知道。如有任何帮助,我们将不胜感激。
由于分布式计算系统的工作方式,云函数不保证触发器的一次性执行,特别是对于无法从系统中消除的可能错误。最好的情况下,它可以保证至少执行一次。这在文档中进行了讨论:
Cloud Functions 保证事件源发出的每个事件至少执行一次事件驱动函数。默认情况下,如果函数调用因错误而终止,则不会再次调用该函数并且事件将被删除。当您对事件驱动函数启用重试时,Cloud Functions 会重试失败的函数调用,直到成功完成或重试窗口到期。
也就是说,如果不确定第一次尝试是否已完成,Cloud Functions 可能会重试您的函数多次。您可以编写代码来确保您的函数对于系统内置的重试是幂等的。