Первый запрос Firebase Realtime Database не отвечает - PullRequest
0 голосов
/ 30 апреля 2020

Привет и спасибо за чтение.

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

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

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

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

serviceAccount битовый поток: облако "pluto": центр данных "paperino": "gastone" "datacenter:" gastone "ull:" bandabassotti "vula:" minn ie "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 Ответ

1 голос
/ 30 апреля 2020

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

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

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

Одна вещь, которую вы делаете при вызове 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}`);
   });
...