Первый запрос базы данных Firebase Realtime не отвечает

Привет и спасибо, что прочитали это.

Я учусь работать с Dialogflow и Firebase Realtime Database, и мне очень нравятся эти платформы. Я создал очень простую структуру БД на Firebase с 7 полями, и в моем агенте я запрашиваю их с очень простым выполнением. Кажется, он работает, но каждый «первый запрос», который я делаю на следующий день, длится около 5000 мс, поэтому БД не отвечает: начиная со второго запроса, он работает почти в реальном времени, поэтому кажется, что он спит или что-то в этом роде. В моем сегодняшнем тесте по первому запросу я прочитал это в журнале Dialogflow: "webhook_latency_ms": 4663, но, по крайней мере, это сработало, как правило, это не так.

Похоже, есть некоторая неуверенность в получении данных из БД.

Любое предложение было бы очень признательно.

Структура базы данных в реальном времени такова:

serviceAccount bitstream: "плутон" облако: "paperino" дата-центр: "gastone" дата-центр: "gastone" ull: "bandabassotti" vula: "minnie" wlr: "pippo"

и вот как я запрашиваю Firebase:

 const servizi = agent.parameters.elencoServiziEntity;      
        return admin.database().ref("serviceAccount").once("value").then((snapshot) =>
            {  
                var accountName = snapshot.child(`${servizi}`).val();
                agent.add(`L'Account Manager del Servizio ${servizi} si chiama:  ${accountName}`);
                console.log(`${servizi}`);
            });



Ответы (1)


Задержка веб-перехватчика не всегда связана с вызовом базы данных - она ​​включает время, которое может потребоваться для запуска самого веб-перехватчика. Если вы используете облачные функции Firebase или встроенный редактор кода Dialogflow (который использует функции Google Cloud), для запуска функции требуется время «холодного старта». Если ваш веб-перехватчик работает где-то еще, например, на AWS Lambda, у вас может быть сетевая задержка в дополнение к времени холодного запуска.

Вы мало что можете с этим поделать. Если вы работаете с одним из решений Google Cloud Function, убедитесь, что вы запускаете их в регионе Central-1, который находится недалеко от того места, где также работает Dialogflow. Чтобы полностью избежать холодного старта - запускайте сервер.

Однако обычно задержка и время холодного старта не должны быть такими долгими. Это говорит о том, что ваш код также требует времени для запуска. Возможно, вы захотите просмотреть свои журналы, чтобы понять, почему время выполнения занимает так много времени - вызов Firebase RTDB может быть его частью, но могут быть другие причины, вызывающие замедление, которые вы не отображаете в своем коде.

Одна вещь, которую вы делаете при вызове Firebase, - это извлечение всей записи, а не только одного поля, которое запрашивает пользователь. Это требует больше данных для маршалинга, что требует больше времени. (Это займет намного больше времени? Возможно, нет. Но миллисекунды - счет.)

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

   const servizi = agent.parameters.elencoServiziEntity;      
   return admin.database()
     .ref("serviceAccount")
     .child(servizi)
     .once("value")
     .then((snapshot) => {  
       const accountName = snapshot.val();
       agent.add(`L'Account Manager del Servizio ${servizi} si chiama:  ${accountName}`);
       console.log(`${servizi}`);
   });
person Prisoner    schedule 30.04.2020
comment
Во-первых, большое спасибо за ваш быстрый и подробный ответ. - person Fabrizio; 30.04.2020
comment
Я изменил код и понимаю, что это очень правильно в том, как вы написали, и мне кажется, что я получил более быстрый ответ. Я также проверил и использую host us-central1, я провел другой тест после того, как не использовал агент в течение нескольких часов, и первые два запроса не вернули никаких значений, начиная с третьего он работал нормально. - person Fabrizio; 30.04.2020
comment
В журнале GCP я вижу ошибку, которую я не могу понять: dialogflowFirebaseFulfillment Warning, оценка Firebase Config на основе GCLOUD_PROJECT. Инициализация firebase-admin может завершиться ошибкой. Также я прочитал предупреждение: доступ к устаревшей конечной точке сервера метаданных в / computeMetadata / v1beta1 / instance / service-accounts / default / token, но я не знаю, где исследовать. - person Fabrizio; 30.04.2020
comment
Если вы запускаете это с помощью Google Cloud Functions, вы можете добавить дополнительное ведение журнала, чтобы увидеть, где в вашем коде происходят замедления, и обновить свой вопрос, указав, что показывают журналы. Чтобы помочь в дальнейшем, было бы также полезно, если бы вы обновили свой вопрос, указав как можно больше информации о том, как вы развертываете свой код, дополнительные сведения о вашем коде и среде выполнения и т. Д. - person Prisoner; 01.05.2020