DialogFlow测试云功能并发性

问题描述 投票:2回答:1

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

哪个带给我这个问题,那就是我该如何测试?我已经尝试在浏览器控制台中进行测试的同时,使用Google Assistant应用在我的移动设备上进行测试。我目睹了两个会话合并在一起,这是一个可怕的混乱,但是我不确定这是全局范围,还是不确定我是否正在使用相同的用户帐户测试两个会话。

有人能启发我使用同一个用户帐户来执行两个相同的操作吗?似乎conv.data对象混合了我正在运行的两个不同会话,这表明它在两个会话中都使用了相同的会话令牌。

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

google-cloud-functions dialogflow actions-on-google dialogflow-fulfillment
1个回答
2
投票

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

您可以通过打开StackDriver登录来验证这一点,这将使您检查Dialogflow在实现中使用的确切请求和响应,其中将包括用于跟踪的会话ID。 (并且,如果您认为两者混合在一起,则发布请求和响应详细信息将有助于弄清发生了什么。)

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

我的态度是,诸如此类的全局变量应被视为只读。如果您希望某个环境对象仅包含本次会议的相关信息,那么我将把它与哲学设计区分开来。

当然,我不会使用该全局状态来存储之间会话的信息。虽然仅会调用一个函数,但我不确定该函数如何与Promises配合使用-一旦启动任何异步操作,您将需要使用Promises。它还冒着后续调用可能在不同实例上的风险。

简而言之,我的方法(在多声方面我相当坚定):

  • 将所有状态存储在上下文中(conv.data应该如此。
  • 通过requestconv或您创建的其他某些特定于请求的对象访问。
  • 全局信息/配置应为只读。
© www.soinside.com 2019 - 2024. All rights reserved.