如何确保一次仅一次进行一次HTTP Cloud Function调用的并发性

时间:2018-09-23 03:03:02

标签: firebase google-cloud-firestore google-cloud-functions

我已经将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);
});

如果我调用此函数并传递相同的stand_id,并且保留时间重叠,则会出现问题,我注意到该函数不会等待调用第一个函数完成的那一个在开始后续函数之前就完成请求。

有没有一种方法可以更好地解决这个问题?或任何解决方法? 还是我只是误解了以下文档?: Doc screenshot

1 个答案:

答案 0 :(得分:2)

您不能安排一次仅调用一次功能。您应该期望Cloud Functions将scale up multiple server instances to handle load,然后在不再需要它们时按比例缩小它们。这是Cloud Functions的一项重要功能,因为系统绝对需要在负载下进行扩展。

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

  

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

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