Функции Firebase cloud увеличивают номер очереди

#firebase #flutter #google-cloud-firestore #google-cloud-functions

#firebase #flutter #google-облако-firestore #google-cloud-функции

Вопрос:

Я работаю над приложением ресторана Flutter, где в каждом ресторане есть документ cloud firestore, и в поле с именем queueNumber это значение начинается с 1 и с каждым заказом увеличивается на 1.

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

     .onCreate(async (snapshot, context) => {

        const orderData = snapshot.data();
        const id = orderData.id;

        if (orderData amp;amp; orderData.restaurantId != null)  {
          
            return restDoc.update({
                queueNumber: admin.firestore.FieldValue.increment(1)
            })
        }

    });
  

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

Вот в чем проблема: иногда, когда два заказа размещаются один за другим, они получают один и тот же номер очереди. Конечный результат в документе ресторана правильный, но отдельные заказы получают неправильный номер (например: в заказе 1 51, в заказе 2 51, в документе ресторана 53)

Есть ли способ исправить этот метод или лучший подход для обработки номеров очередей
Спасибо.

Ответ №1:

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

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

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

  1. Прочитайте документ счетчика
  2. Увеличьте значение счетчика в памяти
  3. Создайте новый документ с этим значением
  4. Также обновите документ счетчика этим значением

Все это должно быть сделано в рамках транзакции, иначе это будет небезопасно.