Обновляйте поле документа Firestore с высокой частотой

# #javascript #node.js #firebase #google-cloud-firestore

Вопрос:

Я новичок в Firestore, разрабатываю приложение, использующее NodeJS и Firestore в качестве базы данных для извлечения и обновления данных.

Пример структуры Firestore приведен ниже:

 CollectionA:
    name: "name"
    id: "id"
    status: "status"
 

Предположим, status что поле может принимать одно из приведенных ниже строковых значений.
начало, in_progress, ожидание, конец.

Поля name и id обновляются один раз при создании, и поле status может обновляться несколько раз (в миллисекундах).

Я хотел бы понять следующие пункты:

  1. Делает ли приведенный ниже фрагмент обновления, удостоверяется, что данные записаны в серверную часть, а затем переходит к следующей строке инструкции. Или обновляются только метаданные, которые еще предстоит записать в бэкенд БД?
 await docRef.update({
    status: "in_progress",
});
 
  1. Существует ли какое-либо ограничение по времени для обновления определенного поля в документе? Означает, что количество записей в определенное поле может быть выполнено за 1 секунду?

Примечание: Я не смог бы использовать пакетную фиксацию, так как я использую это status поле в качестве управляющего сигнала для вызова определенных блоков кода.

Спасибо вам за вашу помощь.

Ответ №1:

Как update говорится в документации, он возвращает:

Обещание [которое] будет выполнено, как только данные будут успешно записаны в серверную часть

Поскольку вы используете await , заявление завершится, как только обещание от update вызова будет выполнено.

Поэтому, если вы обернете его в обработчик исключений:

 try {
  await docRef.update({
    status: "in_progress",
  });
  // 👈 If you get here, the write completed on the server
}
catch (error) {
  // 👈 If you get here, the write failed
  console.error(error);
}
 

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

Максимальная постоянная скорость записи в документ

1 в секунду

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

Как это объясняется, вы можете превышать лимит в течение коротких периодов времени, что, по-видимому, является вашим вариантом использования.

Комментарии:

1. Привет, Фрэнк, спасибо за подробное объяснение. Последующий запрос, поскольку я обновляю конкретное поле документа с более высокой скоростью (в миллисекундах), выдаст ли он ошибку, если какие-либо обновления / записи завершатся неудачно в течение этого короткого периода? Или это проходит незамеченным?

2. Как сказано в документации, 1 запись на документ в секунду является мягким ограничением и может быть превышена короткими очередями. Как сказано в моем ответе, это, похоже, соответствует вашему варианту использования. Но если вы превысите это ограничение для одного документа в течение более длительных периодов времени, вы можете увидеть разногласия в этих записях.

3. Ценю вашу помощь. Это действительно полезно. Да, как вы упомянули в моем случае, записи не должны завершаться неудачей, так как я пишу максимум 4 записи, но короткими очередями.

4. Я просмотрел документы. «может быть превышено короткими очередями», есть ли для этого количественная оценка?

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