Как вы массово удаляете документы из большой коллекции в облачном хранилище? - PullRequest
0 голосов
/ 10 апреля 2020

Мы используем облачную функцию для удаления всех данных старше 6 месяцев из нашего пожарного депо. К сожалению, это заканчивается тайм-аутом. Мы создали код на основе: https://firebase.google.com/docs/firestore/manage-data/delete-data

Мы извлекаем коллекцию, которую нам нужно l oop, используя listDocuments(). Мы не можем использовать get() в нашем случае, так как он не вернет все документы. У нас есть документы, которые были созданы без явного создания пути к нему.

Это было наше первое препятствие на самом деле, когда облачная функция достигла таймаута для этой функции. Обновление нашей облачной функции до последней версии (изменения кода) [https://github.com/googleapis/nodejs-firestore/issues/825] и увеличение тайм-аута до 300 секунд помогли решить проблему.

Однако сейчас мы достигли тайм-аутов на действия по удалению. Мы заметили, что удаление в больших коллекциях происходит очень медленно, например, попытка удалить 10 документов в коллекции из 2000 документов медленнее, чем удаление 200 документов из коллекции из 210 документов. Каждое из этих удалений может занять от нескольких миллисекунд (для небольших коллекций) до почти 3 секунд (для больших коллекций). Потому что пакетные действия ограничены макс. из 500 [https://firebase.google.com/docs/firestore/manage-data/transactions] , в итоге мы получим несколько 3-секундных удалений, которые в конечном итоге достигнут тайм-аута.

Шаги, которые мы предприняли для решения проблемы:

  1. Просмотрите документацию firebase еще раз и проверьте stackoverflow для возможных решений, хотя, кажется, нет поста, имеющего решение для этого
  2. Contact firebase, но они не помогли, поскольку упомянули, что это было вне их области поддержки и что нам нужно было проверить stackoverflow.
  3. Обновлена ​​облачная функция для использования последних версий (и изменений кода), которая установила тайм-аут на listDocuments()
  4. Увеличил тайм-аут до 540 секунд, что является максимумом, который мы могли бы установить на [https://cloud.google.com/functions/docs/concepts/exec#timeout]

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Firestore не предназначен для такого рода процессов. Я рекомендую взглянуть на Bigtable . Однако, если вам необходимо для использования Firestore, я предлагаю следующую схему.

  1. Создайте экземпляр Compute Engine для этой задачи.
  2. Включите код массового удаления в экземпляр.
  3. Создайте сценарий запуска , который выполняет эту задачу и затем завершает работу.
  4. Используйте Планирование для включения экземпляра один раз в месяц или введите период c.

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

0 голосов
/ 10 апреля 2020

Я бы предложил прочитать документацию по передовым методам Firestore . В частности, обратите внимание на часть, в которой упоминается « hotspotting »:

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

  • Создает новые документы с очень высокой скоростью и выделяет свои собственные монотонно увеличивающиеся идентификаторы.

  • Cloud Firestore распределяет идентификаторы документов, используя алгоритм разброса. Вы не должны сталкиваться с горячей точкой при записи, если создаете новые документы с использованием автоматических c идентификаторов документов.

  • Создает новые документы с высокой скоростью в коллекции с несколькими документами.

  • Создает новые документы с монотонно увеличивающимся полем, например, отметкой времени, с очень высокой скоростью.

  • Удаляет документы в коллекции с высокой скорость.

  • Запись в базу данных с очень высокой скоростью без постепенного увеличения трафика c.

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

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