Могут ли свойства Bot ConversationData перезаписываться, даже если они установлены ровно один раз? - PullRequest
0 голосов
/ 12 июня 2018

Мы используем расширение BotBuilder-Azure для сохранения различных свойств, представляющих широкий контекст разговора в пакете данных Conversation бота, используя стандартные Get..Data и Set..Data методы, упомянутые здесь .

Кажется, что иногда пакет данных перезаписывается после правильной установки.Это происходит даже для свойств, которые мы устанавливаем только один раз за весь диалог.

например,

  1. вызывать наборы событий isInitialized = true один раз в начале разговора
  2. событие сообщения1 устанавливает name = "John"
  3. событие сообщения 1 получает isInitialized = true, name = "John"
  4. событие сообщения 2 и все последующие сообщения получают isInitialized = false, name = null

Мы используем политику LastWriteWins следующим образом.Мы предполагаем, что даже если 2 события записи произойдут не по порядку, только записываемое свойство одновременно будет перезаписано, а свойство, которое устанавливается только один раз во всем потоке, не должно перезаписываться никогда.Разве это предположение не верно?

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

1 Ответ

0 голосов
/ 13 июня 2018

Мы предполагаем, что даже если 2 события записи произойдут не по порядку, только записываемое свойство одновременно будет перезаписано, а свойство, которое устанавливается только один раз во всем потоке, не должно перезаписываться никогда.Разве это предположение не верно?

Нет
Вся база данных переписывается, поэтому любые свойства в ConversationData будут содержать значения того, что было сохранено в последний раз

this Семафор гарантирует, что сообщения на одном компьютере обрабатываются в том порядке, в котором сервер получает их, используя идентификатор разговора и пишет, что записи в разговоре или в пакетах личных разговоров не будут конфликтовать.Как только бот масштабируется вбок, эта гарантия больше не существует.

Для данных, специфичных для пользователя, используйте UserData.Идентификатор разговора не гарантированно сохраняется в течение всего разговора (в большинстве случаев), независимо от того, как вы интерпретируете «весь разговор».Как определяется идентификатор разговора, отличается для каждого канала.В некоторых случаях вы можете даже увидеть новую беседу для каждого сообщения.Я предполагаю, что именно поэтому вы наблюдаете такое поведение, новый идентификатор разговора не будет содержать ConversationData из другого разговора с тем же пользователем.

Тем не менее, идентификатор пользователя обычно гарантируется в большинствеканалы.Могут быть некоторые исключения из этого, но по большей части это будет верно.

Вы не указали информацию о каналах, которые вы используете, поэтому я стараюсь быть как можно более общим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...