Проблема с производительностью запросов Firestore в облачных функциях Firebase

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

Вопрос:

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

 let querySnapshot = await admin.firestore()
    .collection("enrollment")
    .get()
 

Коллекция регистрации насчитывает около 23 тысяч документов, общая сумма которых составляет около 6 МБ.

Насколько я понимаю, поскольку функция https выполняется на сервере без состояния облачной функции, она не должна зависеть от размера результата запроса. И Firestore, и облачные функции работают в одном регионе (США-центральный). Тем не менее, 10 секунд-это действительно большой промежуток времени для выполнения такого простого запроса, который приводит к небольшому размеру моментального снимка.

Интересным фактом является то, что позже в коде я обновляю эти 23 тыс. документов обратно новым полем с помощью Bulk Writer, и для запуска bulkWriter.commit () требуется менее 3 секунд.

Другой факт заключается в том, что функция https не возвращает клиенту никаких результатов запроса, поэтому время «загрузки» не должно влиять на производительность функции.

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

Есть ли что-нибудь, что вы могли бы предложить для оптимизации этого?

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

1. Вы пробовали увеличить объем памяти вашей облачной функции? Возможно, вы столкнулись с ограничениями процессора при анализе данных по проводу (по умолчанию функция размером 256 МБ имеет процессор только 800 МГц). См.раздел Цены для получения данных о комбинациях памяти/процессора.

2. @MichaelBleigh Я увеличил объем памяти до 2 ГБ, но все равно получаю то же поведение.

3. Привет, вы можете посмотреть, поможет ли вам это обсуждение: py4u.net/discuss/280945 .

4. @ZeenathSN спасибо, что поделился этой ссылкой. К сожалению, обсуждение, на которое вы ссылаетесь, касается клиентского SDK firebase, в то время как моя проблема связана с SDK администратора для облачных функций. Что привлекло мое внимание в этом обсуждении, так это тот факт, что firestore работает намного медленнее, чем база данных в реальном времени.

Ответ №1:

Когда мы выполняем get(), создается запрос ко всем снимкам документа и возвращаются результаты. Эти результаты извлекаются последовательно в рамках одного выполнения, т. е. список возвращается и анализируется последовательно до тех пор, пока не будут перечислены все документы.

Хотя данные могут быть небольшими, существуют ли какие-либо подколлекции? Это может добавить некоторую дополнительную задержку, поскольку API извлекает и анализирует вложенные коллекции.

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


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