代码之家  ›  专栏  ›  技术社区  ›  Jojo Narte

如何确保一次只对一个http云函数调用的并发性

  •  0
  • Jojo Narte  · 技术社区  · 6 年前

    下面是我函数的一个片段:

    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\u id和重叠的保留时间,问题就出现了,我注意到这个函数不会等到第一个函数被调用完成后才开始后续的请求。

    有什么办法能让我更好地解决这个问题吗?或者其他解决方法? 还是我只是误解了下面的文档 Doc screenshot

    1 回复  |  直到 6 年前
        1
  •  2
  •   Doug Stevenson    6 年前

    不能一次只调用一次函数。您应该预料到云功能将 scale up multiple server instances to handle load ,然后在不再需要时缩小它们。这是云功能的一个重要特性,因为系统绝对需要在负载下扩展。

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

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

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