即使它们只设置了一次,Bot ConversationData属性也会被覆盖吗?

时间:2018-06-12 20:30:39

标签: botframework

我们正在使用BotBuilder-Azure扩展程序,使用标准ConversationGet..Data方法在机器人的Set..Data数据包中保留代表对话范围内容的各种属性提到here

在设置正确后,有时数据包会被覆盖。即使对于我们在整个对话中只设置一次的属性,它也会发生。

e.g。

  1. 在会话开始时调用事件集isInitialized = true
  2. 消息事件1设置name = "John"
  3. 消息事件1获取isInitialized = truename = "John"
  4. 消息事件2以及所有后续消息获取isInitialized = falsename = null
  5. 我们正在使用LastWriteWins政策,如下所示。我们假设即使2个写入事件无序发生,只有被写入时间的属性才会被覆盖,并且在整个流程中只设置一次的属性不应该被覆盖。这个假设有效吗?

    builder.Register(c => 
        new CachingBotDataStore(store, CachingBotDataStoreConsistencyPolicy.LastWriteWins))
            .As<IBotDataStore<BotData>>()
            .AsSelf()
            .InstancePerLifetimeScope();
    

1 个答案:

答案 0 :(得分:2)

  

我们假设即使2个写入事件无序发生,只有被写入时间的属性才会被覆盖,并且在整个流程中只设置一次的属性不应该被覆盖。这个假设有效吗?

没有
整个数据库被重写,因此ConversationData中的任何属性都将包含上次保存的任何值

Semaphore确保单个计算机上的消息按照服务器接收它们的顺序处理会话ID并写入会话或私人会话包不会发生冲突。一旦机器人横向缩放,这种保证就不再存在了。

对于特定于用户的数据,请使用UserData。无论您如何解释&#34;整个会话&#34;,会话ID都不能保证在整个会话期间(大多数情况下)持续存在。如何确定会话ID对于每个频道是不同的。在某些情况下,您甚至可能会看到每封邮件的新会话。我猜这就是您看到此行为的原因,新的会话ID不会包含与同一用户的其他会话中的ConversationData

但是,大多数频道通常都会保证用户ID。可能有一些例外,但大多数情况下都是如此。

您没有包含有关您正在使用的频道的任何信息,所以我尽量做到尽可能一般。