如何确保http Cloud Function调用的并发性一次只有一个

Joj*_*rte 2 firebase google-cloud-functions google-cloud-firestore

我已经设置了一个 Http Cloud Function 作为预订系统的后端。此函数从 Cloud Firestore 访问数据,检索现有的预订时间并检查预订是否与现有时间重叠。如果只能触发请求的一个并发实例,那么这不会有问题,但是我注意到,当同时从多个源请求同一函数时,该函数将以某种基于并行的方式运行这些多个请求在我的日志上。

下面是我的函数的片段:

exports = module.exports = functions.https.onCall(async (data, context) => {
  const { stand_id, user_id, reservation } = data;
  const isReservationValid = await checkAvailability(reservation, stand_id);

  if (!isReservationValid) {
    throw new functions.https.HttpsError('aborted', 'Errr');
  }

  return await createReservation(stand_id, user_id, reservation);
});
Run Code Online (Sandbox Code Playgroud)

如果我调用这个函数并传入相同的stand_id和重叠的保留时间,就会出现问题,我注意到该函数不会等待第一个被调用的函数完成后再开始后续请求。

有什么办法可以更好地解决这个问题吗?或者有什么解决方法吗?或者我只是误解了下面的文档?: 文档截图

Dou*_*son 5

您不能安排一次只调用一次函数。您应该期望 Cloud Functions 将扩展多个服务器实例来处理负载,然后在不再需要时缩小它们。这是 Cloud Functions 的一个重要功能,因为系统绝对需要在负载下进行扩展。

您所指的文档说单个 Cloud Functions 实例一次只能处理一个请求。但您需要首先阅读并理解该部分的第一段,因为这种行为永远不会改变:

Cloud Functions 可能会启动多个函数实例来扩展您的函数以满足当前负载。这些实例并行运行,从而导致多个并行函数执行。

如果您的函数需要在函数中写入 Firestore,并且这些函数可能写入同一文档,则您需要使用事务来确保每个更新不会以导致数据丢失的方式相互覆盖。