У нас есть динамические страницы, которые обслуживаются облачными функциями Firebase, но TTFB
очень медленный на этих страницах с TTFB 900ms - 2s
, сначала мы просто предположили, что это проблема с cold start
, но даже при постоянном трафике очень медленно TTFB 700 700ms - 1.2s
.
Это немного проблематично для нашего проекта, поскольку он зависит от организации трафика, и Google Pagespeed потребует ответа сервера менее 200 200ms
.
В любом случае, мы попытались проверить, что может вызвать проблему, и мы определили ее с помощью Firestore, когда Cloud Function обращается к Firestore, мы заметили, что есть некоторые задержки. Это базовый пример кода того, как мы реализуем Cloud Function и Firestore:
dynamicPages.get('/ph/test/:id', (req, res) => {
var globalStartTime = Date.now();
var period = [];
db.collection("CollectionTest")
.get()
.then((querySnapshot) => {
period.push(Date.now() - globalStartTime);
console.log('1', period);
return db.collection("CollectionTest")
.get();
})
.then((querySnapshot) => {
period.push(Date.now() - globalStartTime);
console.log('2', period);
res.status(200)
.send('Period: ' + JSON.stringify(period));
return true;
})
.catch((error) => {
console.log(error);
res.end();
return false;
});
});
Это работает на Firebase + Cloud Functions + NodeJS
CollectionTest очень мал, и внутри него всего 100 документов, причем каждый документ имеет следующие поля:
directorName: (string)
directorProfileUrl: (string)
duration: (string)
genre: (array)
posterUrl: (string)
rating: (string)
releaseDate: (string)
status: (int)
synopsis: (string)
title: (string)
trailerId: (string)
urlId: (string)
С помощью этого теста мы получим следующие результаты:
[467,762] 1.52s
[203,315] 1.09s
[203,502] 1.15s
[191,297] 1.00s
[206,319] 1.03s
[161,267] 1.03s
[115,222] 843ms
[192,301] 940ms
[201,308] 945ms
[208,312] 950ms
Эти данные являются [ Firestore Call 1 Exectution Time, Firestore Call 2 Exectution Time ] TTFB
Если мы проверим результаты теста, есть признаки того, что TTFB становится ниже, может быть, это когда облачная функция уже разогрелась? Но даже в этом случае Firestore едет до 200-300 мс в Облачной функции, основанной на результатах нашего второго звонка Firestore, и даже если Firestore заняло меньше времени для выполнения, TTFB все равно займет 600-800 мс, но это совсем другая история.
В любом случае, может ли кто-нибудь помочь, как улучшить производительность Firestore в наших Облачных функциях (или, если возможно, в производительности TTFB)? Может быть, мы делаем что-то явно неправильное, о чем мы не знаем?