我有一个HTTP触发的函数,每次调用端点时都会返回一个增量编号。代码如下所示:
export const reserve = functions.https.onRequest((req, resp) => {
cors(req, resp, async () => {
if (req.method.toLowerCase() !== 'post') {
resp.status(405);
resp.end();
} else {
const path = `counter`;
const ref = firebase.database().ref(path);
const oldCount = (await ref.once('value')).val();
await ref.set(oldCount + 1);
resp.status(200).send({
number: oldCount
});
resp.end();
}
});
});
问题是,如果2个调用彼此非常接近,那么该函数是否有可能返回相同的数字?如果是这样,有没有办法防止这种情况?
答案 0 :(得分:2)
是的,你是对的,可能会出现这样的问题。我不熟悉firebase,但是寻找一些东西可以让你直接在firebase中增加这个数字而不必先获取它。这将是一个原子操作,并确保您不会遇到您描述的问题。
如果使用firebase无法做到这一点,那么您可能必须在中间设置一个服务器,以某种方式保留计数器的记录。每次要增加/减少数量时,请求都会通过您的服务器,该服务器首先对缓存执行操作,然后通过调用Firebase API完成请求。
<强>更新强> 以下是Firebase recommends this:
的方法ref.transaction(function (current_value) {
return (current_value || 0) + 1;
});