代码之家  ›  专栏  ›  技术社区  ›  Lee Probert

DialogFlow测试云函数并发性

  •  0
  • Lee Probert  · 技术社区  · 5 年前

    我有一个谷歌助手的行动与履行通过Firebase云功能。我理解云函数可能在调用之间共享实例,并且您可以使用全局范围来完成繁重的工作和准备工作。我的函数实例化了一个全局类,该类序列化了一些JSON并处理返回的数据和函数中的其他任务。我在这个类中有一些变量是在调用函数时设置的,并且我很小心地确保所有变量都是使用 conv.data 当前会话唯一的会话数据对象。希望是,尽管类实例可能存在于不同的调用之间,也可能存在于不同的用户之间,但它仍将被上下文化到本地范围,并且我不会看到任何变量被其他会话覆盖。

    这就引出了一个问题,那就是,我该如何测试这个呢?我试着在我的移动设备上使用googleassistant应用程序进行测试,同时在浏览器控制台中进行测试。我目睹了两个会话合并在一起,这是一个不神圣的混乱,但我不确定这是否是全局范围,或者只是我用同一个用户帐户测试了两个会话。

    有人能告诉我是否可以使用同一个用户帐户运行两个相同的操作吗?看起来像是 转换数据 对象混合了我正在运行的两个不同会话,这表明它在两个会话中使用相同的会话令牌。

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

    0 回复  |  直到 5 年前
        1
  •  2
  •   Prisoner    5 年前

    对话流 保存数据 conv.data 隔离到单个会话,甚至来自同一用户的会话。使用Dialogflow时,这些数据存储在特定于会话的上下文中。

    您可以通过打开StackDriver登录来验证这一点,这将允许您检查Dialogflow用于实现的确切请求和响应,这将包括用于跟踪的会话ID。(如果您认为这是两者的混合,那么发布请求和响应的详细信息将有助于了解情况。)

    我的态度是,像这样的全局应用程序应该被视为只读的。如果你想让某个环境对象包含本课程的相关信息,我会把它和哲学设计分开。

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

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

    • 转换数据 应该如此)。
    • request conv ,或您创建的其他特定于请求的对象。
    • 全局信息/配置应为只读。
    推荐文章