Можно ли выполнять полное сканирование коллекции в малообъемной коллекции firestore?

# #firebase #google-cloud-firestore #google-cloud-functions #database-performance

Вопрос:

Серверная часть моего мобильного приложения — это несколько небольших функций firebase / Google Cloud, которые выполняют различные операции CRUD с моей базой данных firestore. Я столкнулся с проблемой, когда мне требуется ежедневно обновлять все документы в коллекции. У меня есть задание cron, которое запускает функцию каждый день в указанное время. Чтобы избежать полной проверки коллекции, я попробовал несколько хитрых способов обойти невозможность самостоятельного вызова функций, например, с помощью AWS lambdas. В конечном итоге это не сработало. Поскольку я не ожидаю больших объемов данных (каждый документ содержит около 8 строковых полей; ожидается максимум 10 000 документов) Я подумал, может быть, полное сканирование коллекции на самом деле не будет таким дорогим. Был ли у кого-нибудь опыт полного сканирования таблиц в firestore и какова была производительность?

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

1. Я не понимаю, о чем вы спрашиваете. Что такое полное сканирование коллекции? Что именно вы пытаетесь сделать? О какой производительности мы говорим?

2. Получить все документы в коллекции. Я пытаюсь получить все документы в коллекции из облачной функции, а затем выполнить цикл и обновить поле. Просто интересно, можно ли это сделать из облачной функции Google с точки зрения скорости. Интересно, возникнут ли у меня проблемы с тайм-аутом и тому подобное?

3. зачем вам сканировать, если вам все равно нужно обновлять все документы? Звучит как странный дизайн. Может быть, вы можете объяснить, зачем это нужно?

4. Ну, мне нужно получить идентификатор элемента, чтобы иметь возможность обновлять его с правильным значением. Я не могу обновить документ, если не знаю, что это такое. Итак, в основном у меня есть поле статуса истечения срока действия, и мне нужно, чтобы оно обновлялось ежедневно, поскольку его значение основано на дате. Если это имеет смысл. Не каждая запись нуждается в обновлении, но это возможно, поэтому мне нужно проверять каждый документ.

Ответ №1:

У меня есть поле статуса истечения срока действия, и мне нужно, чтобы оно обновлялось [ежедневно], поскольку его значение основано на дате.

Вместо ежедневного сканирования всей коллекции рассмотрите возможность использования облачной задачи для запуска каждого отдельного документа точно по истечении срока его действия. Со временем это, вероятно, будет более эффективным, поскольку масштабируется в зависимости от количества истекающих документов, а не от общего количества документов. Пример запуска отдельных документов с помощью облачных задач см. В сообщении в блоге Doug: Как запланировать запуск облачной функции в будущем с облачными задачами (для создания TTL документа Firestore).


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

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

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

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

2. Для предотвращения проблем с памятью достаточно просто разбиения на страницы, и самозапуск не требуется. Если вы хотите выполнить работу с помощью нескольких вызовов облачной функции, вы можете, например, отправить исходной функции сообщение в pubsub для каждой страницы.

3. ХОРОШО, это звучит как надежное решение. Таким образом, у меня могла бы быть функция, которая считывает страницу из базы данных, отправляет ее в pub sub и имеет функцию обновления, которая запускается, когда сообщение попадает в тему. Нужно ли мне делать что-то особенное, чтобы ограничить функцию чтением только одного сообщения из темы? И я предполагаю, что он автоматически масштабируется и запускает другую функцию, если по теме появилось другое сообщение, и функция уже обрабатывала сообщение? Прошу прощения, если это простые вопросы, которые я задаю в основном из-за опыта aws, который только что перешел в Google Cloud

4. Я бы рекомендовал сначала попробовать заставить это работать только с одной облачной функцией, которая разбивает результаты на страницы. Как только это заработает, у вас будет лучшее представление о том, сколько документов вы можете просмотреть за максимальное время выполнения одной функции, и, таким образом, вам будет легче решить, нужно ли распространять его через PubSub.