Firestore 写入的 Firebase Cloud Functions 执行结果与实际观察到的值不同

问题描述 投票:0回答:1

我正在使用

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 仪表板中看到的值不同。

怎么可能呢?我完全不知道。如有任何帮助,我们将不胜感激。

firebase google-cloud-firestore firebase-authentication google-cloud-functions
1个回答
0
投票

由于分布式计算系统的工作方式,云函数不保证触发器的一次性执行,特别是对于无法从系统中消除的可能错误。最好的情况下,它可以保证至少执行一次。这在文档中进行了讨论:

Cloud Functions 保证事件源发出的每个事件至少执行一次事件驱动函数。默认情况下,如果函数调用因错误而终止,则不会再次调用该函数并且事件将被删除。当您对事件驱动函数启用重试时,Cloud Functions 会重试失败的函数调用,直到成功完成或重试窗口到期。

也就是说,如果不确定第一次尝试是否已完成,Cloud Functions 可能会重试您的函数多次。您可以编写代码来确保您的函数对于系统内置的重试是幂等的。

另请参阅:仅触发 Firebase 云函数一次的最佳实践

© www.soinside.com 2019 - 2024. All rights reserved.