【问题标题】:Dialogflow session handling in Cloud FunctionCloud Function 中的 Dialogflow 会话处理
【发布时间】:2019-11-15 08:44:47
【问题描述】:

目前,我正在 Cloud Function 中进行简单的会话处理,作为 Dialogflow 实现。 在我的脚本中,我保留了由用户输入或从外部 API 获取的各种变量。为了处理会话,我将变量数据保存在 Firestore 数据库中。但是,当两个不同的用户同时与机器人通信时,会话仍然会覆盖彼此的变量,从而导致会话中断。

现在,我有以下工作流程:

  • 检测到意图时,在 Firestore 中查找现有会话数据(外部触发器提供的 Dialogflow 会话 ID 用作存储键)
  • 如果已经有数据,将变量数据加载到脚本内部的全局变量中
  • 根据加载的变量处理意图代码
  • 根据变量向用户生成输出
  • agent.add(...) 之后,将数据保存回 Firestore 数据库

对我来说,这看起来仍然合乎逻辑。此外,加载和保存到数据库经过测试并按预期工作。但不知何故,如果两个或更多用户同时通信,则数据会在其间被覆盖。我怎样才能防止这种情况? Cloud Functions 不应该能够自行“扩展”吗,这对我来说意味着这些函数可以同时为一千个用户工作而没有任何竞争条件?

【问题讨论】:

  • 这里是代码,我不得不废弃很多行(原来超过 1000 行):codepile.net/pile/JDaz4eGB
  • 我想知道您是否找到了解决方案?我也遇到了同样的问题。

标签: javascript node.js google-cloud-functions dialogflow-es dialogflow-es-fulfillment


【解决方案1】:

您没有显示您的代码,这将有助于我们诊断确切的问题,但您描述中的问题短语是

将变量数据加载到脚本内部的全局变量中

Cloud Functions 可以将同一个实例用于多个调用。所以函数内部的局部变量应该可以安全使用,但真正的全局变量可能会被践踏。

如果您仍然遇到问题,使用确切的编码问题更新您的问题可能会让我们更好地帮助您。

【讨论】:

  • 在上面的代码 sn-p 中,我已经将变量声明更改为本地(在exports.dialogflowFirebaseFulfillment 块内)。但是,这也不起作用,也许大量的局部变量(现在大约 30 个)会减慢云函数的速度。
猜你喜欢
  • 2020-01-05
  • 2017-09-27
  • 2019-08-07
  • 2018-12-19
  • 1970-01-01
  • 2013-03-07
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多