Как обеспечить параллелизм вызовов http Cloud Function только по одному за раз - PullRequest
0 голосов
/ 23 сентября 2018

Я настроил функцию Http Cloud в качестве бэкэнда для системы бронирования.Эта функция обращается к данным из 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 голосов
/ 23 сентября 2018

Вы не можете организовать одновременное включение только одной функции.Следует ожидать, что облачные функции будут увеличивать масштаб нескольких экземпляров сервера для обработки нагрузки , а затем уменьшать их, когда они больше не нужны.Это важная функция облачных функций, поскольку система абсолютно нуждается в масштабировании под нагрузкой.

В документации, на которую вы ссылаетесь, говорится, что один экземпляр облачных функций может обрабатывать только один запрос за раз.Но вам нужно сначала прочитать и понять первый абзац в этом разделе, так как это поведение никогда не изменится:

Облачные функции могут запускать несколько экземпляров функций для масштабирования вашей функции в соответствии с текущей нагрузкой.Эти экземпляры выполняются параллельно, что приводит к выполнению нескольких параллельных функций.

Если ваши функции должны записывать в Firestore в вашей функции, и эти функции могут записывать в один и тот же документ, вынеобходимо использовать транзакцию, чтобы убедиться, что каждое из этих обновлений не перезаписывает друг друга таким образом, что это приводит к потере данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...