Динамические страницы Firebase, использующие облачные функции с Firestore, работают медленно - PullRequest
0 голосов
/ 03 июня 2018

У нас динамические страницы , обслуживаемые Firebase Cloud Functions , но TTFB очень медленный на этих страницах с TTFB 900ms - 2s, сначала мы только предположили, что этоэто проблема cold start, но даже при стабильном трафике она очень медленная при TTFB 700ms - 1.2s.

Это немного проблематично для нашего проекта, поскольку он зависит от органического трафика, и Google Pagespeed потребуетсяответ сервера меньше 200ms.

В любом случае, мы попытались проверить, что может быть причиной проблемы, и мы определили ее с помощью Firestore, когда облачная функция обращается к Firestore, мы заметили некоторые задержки.Это базовый пример кода того, как мы реализуем облачную функцию и 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 + Облачные функции + 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

Thisданные: [ Firestore Call 1 Время ожидания , Firestore Call 2 Время ожидания ] TTFB

Если мы проверим результаты теста, топризнаки того, что TTFB снижается, может быть, это когда облачная функция уже прогрелась?Но даже в этом случае Firestore расходует 200-300 мс в облачной функции, основываясь на результатах нашего второго вызова Firestore, и даже если Firestore потребовалось меньше времени для выполнения, TTFB все равно займет 600-800 мс, но это другая история.

В любом случае, кто-нибудь может помочь, как мы можем улучшить производительность Firestore в наших облачных функциях (или, если возможно, производительность TTFB)?Может быть, мы делаем что-то явно неправильное, о чем не знаем?

1 Ответ

0 голосов
/ 12 июня 2018

Я постараюсь помочь, но, возможно, не хватает некоторого контекста о том, что вы загружаете перед возвратом dynamicPages, но вот некоторые подсказки:

Прежде всего, очевидная часть ( Я долженукажите все равно ):

1 - Позаботьтесь о том, как вы измеряете свой TTFB:

Удаленное измерение TTFB означает, что вы одновременно измеряете задержку сети, чтозатеняет то, что на самом деле измеряет TTFB: насколько быстро веб-сервер может ответить на запрос.

2 - и из документации разработчиков Google о Understanding Resource Timing ( здесь ):

[...].Либо:

Bad network conditions between client and server, or
A slowly responding server application

Чтобы решить проблему с высоким TTFB, сначала отключите как можно больше сети.В идеале, разместить приложение локально и посмотреть, есть ли еще большой TTFB.Если есть, то приложение должно быть оптимизировано для скорости отклика.Это может означать оптимизацию запросов к базе данных, внедрение кэша для определенных частей содержимого или изменение конфигурации вашего веб-сервера.Есть много причин, по которым бэкэнд может быть медленным.Вам нужно будет исследовать ваше программное обеспечение и выяснить, что не соответствует вашему бюджету производительности.

Если TTFB локально низок, то проблема заключается в сетях между вашим клиентом и сервером.Обход сети может быть затруднен любым количеством вещей.Есть много точек между клиентами и серверами, и каждый из них имеет свои ограничения соединения и может вызвать проблемы.Самый простой способ проверить это - поместить ваше приложение на другой хост и посмотреть, улучшится ли TTFB.

Не совсем очевидные:

Вы можете взглянуть на официальныйДокументация Google относительно Cloud Functions Performance здесь: https://cloud.google.com/functions/docs/bestpractices/tips

Вам раньше требовалось несколько файлов?

Согласно этому ответу от Firebase cloud functions is very slow: Облако Firebaseфункции работают очень медленно :

Похоже, что многие из этих проблем можно решить с помощью скрытой переменной process.env.FUNCTION_NAME, как показано здесь: https://github.com/firebase/functions-samples/issues/170#issuecomment-323375462

Доступ к этим загруженным динамическим страницам имеет пользователь guest или пользователь logged?Потому что, возможно, первый запрос должен разобраться в деталях аутентификации, поэтому он, как известно, медленнее ...

Если ничего из этого не работает, я рассмотрю общие проблемы производительности, такие как соединение с БД ( here : Optimize Database Performance), улучшая конфигурацию сервера, кешируйте все, что можете, и позаботьтесь о возможных перенаправлениях в вашем приложении ...

В завершение чтения через Интернет существует множество потоковс вашей проблемой (низкая производительность на простых облачных функциях).Например: https://github.com/GoogleCloudPlatform/google-cloud-node/issues/2374 && в SO: https://stackoverflow.com/search?q=%5Bgoogle-cloud-functions%5D+slow

С такими комментариями:

, поскольку при использовании облачных функций налагается штрафпри каждом вызове http накладные расходы по-прежнему очень высоки (т. е. 0,8 с на HTTP-вызов).

или:

Имейте в виду, что функции Cloud Functions и Cloud Firestore являются одновременнов бета-версии и не дают никаких гарантий для производительности.Я уверен, что если вы сравните производительность с базой данных реального времени, вы увидите лучшие показатели.

Возможно, это все еще проблема.

Надеюсь, это поможет!

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