我们正在使用BotBuilder-Azure扩展程序,使用标准Conversation
和Get..Data
方法在机器人的Set..Data
数据包中保留代表对话范围内容的各种属性提到here。
在设置正确后,有时数据包会被覆盖。即使对于我们在整个对话中只设置一次的属性,它也会发生。
e.g。
isInitialized = true
name = "John"
isInitialized = true
,name = "John"
isInitialized = false
,name = null
我们正在使用LastWriteWins
政策,如下所示。我们假设即使2个写入事件无序发生,只有被写入时间的属性才会被覆盖,并且在整个流程中只设置一次的属性不应该被覆盖。这个假设有效吗?
builder.Register(c =>
new CachingBotDataStore(store, CachingBotDataStoreConsistencyPolicy.LastWriteWins))
.As<IBotDataStore<BotData>>()
.AsSelf()
.InstancePerLifetimeScope();
答案 0 :(得分:2)
我们假设即使2个写入事件无序发生,只有被写入时间的属性才会被覆盖,并且在整个流程中只设置一次的属性不应该被覆盖。这个假设有效吗?
没有
整个数据库被重写,因此ConversationData中的任何属性都将包含上次保存的任何值
此Semaphore确保单个计算机上的消息按照服务器接收它们的顺序处理会话ID并写入会话或私人会话包不会发生冲突。一旦机器人横向缩放,这种保证就不再存在了。
对于特定于用户的数据,请使用UserData
。无论您如何解释&#34;整个会话&#34;,会话ID都不能保证在整个会话期间(大多数情况下)持续存在。如何确定会话ID对于每个频道是不同的。在某些情况下,您甚至可能会看到每封邮件的新会话。我猜这就是您看到此行为的原因,新的会话ID不会包含与同一用户的其他会话中的ConversationData
。
但是,大多数频道通常都会保证用户ID。可能有一些例外,但大多数情况下都是如此。
您没有包含有关您正在使用的频道的任何信息,所以我尽量做到尽可能一般。