【问题标题】:Firebase Realtime Database first query not respondingFirebase 实时数据库第一个查询没有响应
【发布时间】:2020-04-30 09:16:27
【问题描述】:

您好,感谢您阅读本文。

我正在学习如何使用 Dialogflow 和 Firebase 实时数据库,我非常喜欢这些平台。 我在 Firebase 上创建了一个非常简单的数据库结构,其中包含 7 个字段,并在我的代理中以非常简单的方式查询它们。 它似乎正在工作,但我第二天执行的每个“第一个查询”似乎持续约 5000 毫秒,因此数据库没有响应:从第二个查询开始,它几乎实时工作,所以它似乎在睡觉或其他什么。 在我今天对第一个查询的测试中,我在 Dialogflow 日志中读到了这个:“webhook_latency_ms”:4663,但至少它有效,通常它没有。

似乎从数据库中获取数据存在一些不确定性。

任何建议将不胜感激。

实时数据库结构是这样的:

服务帐户 比特流:“冥王星” 云:“paperino” 数据中心:“gastone” 数据中心:“gastone” ull:“班达巴索蒂” 乌拉:“米妮” wlr:“皮波”

这就是我查询 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}`);
            });

【问题讨论】:

    标签: javascript firebase firebase-realtime-database dialogflow-es dialogflow-es-fulfillment


    【解决方案1】:

    webhook 延迟并不总是与数据库调用相关 - 它包括启动 webhook 本身可能需要的时间。如果您使用 Firebase Cloud Functions 或 Dialogflow 内置代码编辑器(使用 Google Cloud Functions),则启动该函数需要“冷启动”时间。如果您的 webhook 在其他地方运行,例如在 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}`);
       });
    

    【讨论】:

    • 首先非常感谢您快速详细的回复。
    • 我更改了代码,我知道您编写的方式非常正确,而且在我看来,我得到了更快的回复。我还检查了,我正在使用主机 us-central1,我在几个小时没有使用代理后进行了其他测试,前两个查询没有返回任何值,从第三个开始它工作正常。
    • 我在 GCP 日志上看到的是一个我无法理解的错误:“dialogflowFirebaseFulfillment 警告,基于 GCLOUD_PROJECT 估计 Firebase 配置。初始化 firebase-admin 可能会失败”。我还阅读了一条警告:“在“/computeMetadata/v1beta1/instance/service-accounts/default/token”访问已弃用的元数据服务器端点,但我不知道去哪里调查。
    • 如果您使用 Google Cloud Functions 运行此程序,您可能希望添加一些额外的日志记录,以查看代码减速发生的位置,并使用日志显示的内容更新您的问题。为了进一步提供帮助,如果您更新您的问题,尽可能多地了解您如何部署代码、有关您的代码和运行时环境的更多详细信息等,这也会很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 2019-04-23
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    相关资源
    最近更新 更多