【问题标题】:DialogFlow Testing Cloud Function concurrencyDialogFlow 测试云函数并发
【发布时间】:2020-03-11 22:20:48
【问题描述】:

我有一个通过 Firebase Cloud Functions 实现的 Google 助理操作。我了解 Cloud Functions 可能会在调用之间共享实例,并且您可以使用全局范围进行繁重的工作和准备工作。我的函数实例化了一个全局类,该类已经序列化了一些 JSON,并在我的函数中处理返回数据和其他任务。我在这个类中有在调用函数时设置的变量,并且我一直小心地确保所有变量都是使用当前对话唯一的conv.data 会话数据对象设置的。希望虽然类实例可能存在于不同的调用之间,并且可能由不同的用户存在,但它仍然会被上下文化到本地范围,并且我不会看到任何变量被其他会话覆盖。

这让我想到了一个问题,即我该如何测试这个?我尝试使用 Google Assistant 应用在我的移动设备上进行测试,同时在浏览器控制台中进行测试。我目睹了这两个会话合并在一起,这是一团糟,但我不确定这是全局范围,还是只是我正在使用同一个用户帐户测试两个会话。

谁能告诉我是否可以使用同一个用户帐户运行两个相同的操作?看起来conv.data 对象混合了我正在运行的两个不同会话,这表明它对两个会话使用相同的会话令牌。

另一个问题是,您认为使用全局类来跨调用存储状态会成为不同用户的问题吗?文档确实声明一次只能发生一次函数调用。所以不应该有任何竞争条件类型的场景。

【问题讨论】:

    标签: google-cloud-functions dialogflow-es actions-on-google dialogflow-es-fulfillment


    【解决方案1】:

    Dialogflow应该conv.data 中的数据隔离到单个会话,甚至来自同一用户的会话。当您使用 Dialogflow 时,此数据存储在特定于会话的上下文中。

    您可以通过启用 StackDriver 登录来验证这一点,这将让您检查 Dialogflow 用于您的履行的确切请求和响应,其中将包括用于跟踪的会话 ID。 (如果您认为它混合了两者,发布请求和响应详细信息将有助于弄清楚发生了什么。)

    非常粗略,听起来您在全局中混入了一些东西,或者可能在一个会话中设置了一些没有被另一个会话清除或覆盖的东西。再说一遍 - 查看确切的请求和响应应该可以帮助您(和/或我们)弄清楚这一点。

    我的态度是这样的全局应该被视为只读。如果您想拥有一些仅包含此会话相关信息的环境对象 - 我会将其与哲学设计分开。

    当然,我不会使用这种全局状态来存储会话之间的信息。虽然只会调用一个函数,但我不确定它如何与 Promises 一起工作——一旦你开始任何异步操作,你就会需要它。它还存在后续调用可能在不同实例上的风险。

    简而言之,我的方法(我在多声部中非常坚定):

    • 将所有状态存储在一个上下文中(conv.data 应该这样)。
    • 通过requestconv 或您创建的其他一些特定于请求的对象访问它。
    • 全局信息/配置应该是只读的。

    【讨论】:

    • 您说的是The data in conv.data shouldn't be mixed between sessions,但文档声明您应该使用conv.data 在整个对话中存储数据。这就是我管理状态自动取款机的方式。我的全局类 is 被写入,但我在每次调用时都这样做,因此它使用仅与该会话相关的信息。我基本上在每一步都将conv.data 的属性传递到类中,这样它就可以执行它的逻辑并构建我需要返回的响应对象。
    • 顺便说一句,非常感谢您抽出宝贵时间回复我。在这方面很难得到合理的建议。
    • 对不起,我说的可能有点不清楚,我已经编辑了一些内容以便更清楚。 conv.data 不应该混淆,这表明您的全球正在发生一些事情。但如果您认为是 - 我们可以帮助您查看一些调试。
    • 它一直在工作。我们已经尝试过并发测试,并且全局类在每一步都使用conv.data 进行自我刷新似乎工作正常。
    猜你喜欢
    • 2020-09-28
    • 2019-08-20
    • 1970-01-01
    • 2021-09-26
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    相关资源
    最近更新 更多