DialogFlow 测试 Cloud Function 并发性
DialogFlow Testing Cloud Function concurrency
我有一个 Google 助手操作,通过 Firebase Cloud Functions 实现。我知道 Cloud Functions 可能会在调用之间共享实例,并且您可以使用 Global 范围进行繁重的工作和准备工作。我的函数实例化了一个全局 class,它序列化了一些 JSON 并在我的函数中处理返回数据和其他任务。我在这个 class 中有变量是在调用函数时设置的,我一直小心地确保所有变量都是使用当前对话唯一的 conv.data
会话数据对象设置的.希望是尽管 class 实例可能存在于不同的调用之间,并且可能由不同的用户使用,但它仍将上下文化到本地范围,我不会看到任何变量被其他会话覆盖。
这让我想到了一个问题,即我如何测试它?我尝试使用 Google 助手应用程序在我的移动设备上进行测试,同时在浏览器控制台中进行测试。我亲眼目睹了这两个会话合并在一起,这是一团糟,但我不确定那是全局范围,还是我正在用同一个用户帐户测试两个会话。
谁能告诉我是否可以 运行 使用同一个用户帐户执行两个相同的操作?看起来 conv.data
对象混合了我 运行ning 中的两个不同会话,这表明它在两个会话中使用了相同的对话令牌。
另一个问题是,您认为使用全局 class 跨调用存储状态对不同的用户来说是个问题吗?文档确实说明一次只能调用一次该函数。所以不应该有任何竞争条件类型的场景。
Dialogflow 应该 将 conv.data
中的数据隔离到单个会话,即使是来自同一用户的会话。当您使用 Dialogflow 时,此数据存储在特定于会话的上下文中。
您可以通过打开 StackDriver 登录来验证这一点,这将让您检查 Dialogflow 正在使用您的实现的确切请求和响应,这将包括用于跟踪的会话 ID。 (如果您认为它混淆了两者,发布请求和响应详细信息将有助于弄清楚发生了什么。)
非常粗略地说,这听起来像是您将某些东西混入了您的全局,或者可能是在一个会话中设置的某些东西没有被另一个会话清除或覆盖。再次重申 - 查看确切的请求和响应应该可以帮助您(and/or 我们)解决这个问题。
我的态度是像这样的全局应该被视为只读。如果您想要一些环境对象,其中包含仅与此会话相关的信息 - 我会将其与哲学设计分开。
当然,我不会使用这个全局状态来存储 会话之间的信息。虽然一个函数只会被调用,但我不确定它如何与 Promises 一起工作——一旦你开始任何异步操作,你将需要它。它还存在后续调用可能在不同实例上的风险。
简而言之,我的方法(我在多声部中非常坚定):
- 将所有状态存储在上下文中(
conv.data
应该如此)。
- 通过
request
、conv
或您创建的其他一些特定于请求的对象访问它。
- 全局信息/配置应该是只读的。
我有一个 Google 助手操作,通过 Firebase Cloud Functions 实现。我知道 Cloud Functions 可能会在调用之间共享实例,并且您可以使用 Global 范围进行繁重的工作和准备工作。我的函数实例化了一个全局 class,它序列化了一些 JSON 并在我的函数中处理返回数据和其他任务。我在这个 class 中有变量是在调用函数时设置的,我一直小心地确保所有变量都是使用当前对话唯一的 conv.data
会话数据对象设置的.希望是尽管 class 实例可能存在于不同的调用之间,并且可能由不同的用户使用,但它仍将上下文化到本地范围,我不会看到任何变量被其他会话覆盖。
这让我想到了一个问题,即我如何测试它?我尝试使用 Google 助手应用程序在我的移动设备上进行测试,同时在浏览器控制台中进行测试。我亲眼目睹了这两个会话合并在一起,这是一团糟,但我不确定那是全局范围,还是我正在用同一个用户帐户测试两个会话。
谁能告诉我是否可以 运行 使用同一个用户帐户执行两个相同的操作?看起来 conv.data
对象混合了我 运行ning 中的两个不同会话,这表明它在两个会话中使用了相同的对话令牌。
另一个问题是,您认为使用全局 class 跨调用存储状态对不同的用户来说是个问题吗?文档确实说明一次只能调用一次该函数。所以不应该有任何竞争条件类型的场景。
Dialogflow 应该 将 conv.data
中的数据隔离到单个会话,即使是来自同一用户的会话。当您使用 Dialogflow 时,此数据存储在特定于会话的上下文中。
您可以通过打开 StackDriver 登录来验证这一点,这将让您检查 Dialogflow 正在使用您的实现的确切请求和响应,这将包括用于跟踪的会话 ID。 (如果您认为它混淆了两者,发布请求和响应详细信息将有助于弄清楚发生了什么。)
非常粗略地说,这听起来像是您将某些东西混入了您的全局,或者可能是在一个会话中设置的某些东西没有被另一个会话清除或覆盖。再次重申 - 查看确切的请求和响应应该可以帮助您(and/or 我们)解决这个问题。
我的态度是像这样的全局应该被视为只读。如果您想要一些环境对象,其中包含仅与此会话相关的信息 - 我会将其与哲学设计分开。
当然,我不会使用这个全局状态来存储 会话之间的信息。虽然一个函数只会被调用,但我不确定它如何与 Promises 一起工作——一旦你开始任何异步操作,你将需要它。它还存在后续调用可能在不同实例上的风险。
简而言之,我的方法(我在多声部中非常坚定):
- 将所有状态存储在上下文中(
conv.data
应该如此)。 - 通过
request
、conv
或您创建的其他一些特定于请求的对象访问它。 - 全局信息/配置应该是只读的。