Обработка сеанса Dialogflow в облачной функции

В настоящее время я работаю над простой обработкой сеанса в облачной функции как выполнение Dialogflow. В моем скрипте я храню различные переменные, либо введенные пользователем, либо полученные из внешних API. Для обработки сеансов я сохраняю переменные данные в базе данных Firestore. Однако, когда два разных пользователя общаются с ботом одновременно, сеансы по-прежнему перезаписывают переменные друг друга, что приводит к прерыванию разговора.

Прямо сейчас у меня следующий рабочий процесс:

  • при обнаружении намерения искать существующие данные сеанса в Firestore (идентификатор сеанса Dialogflow, заданный внешним триггером, используется в качестве ключа хранения)
  • если уже есть какие-либо данные, загрузите данные переменных в глобальные переменные внутри скрипта
  • обрабатывать код намерения на основе загруженных переменных
  • генерировать вывод для пользователя на основе переменных
  • после agent.add(...) сохраните данные обратно в базу данных Firestore

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


person user2651050    schedule 15.11.2019    source источник
comment
Вот код, мне пришлось выбросить много строк (в оригинале более 1000 строк): codepile.net / pile / JDaz4eGB   -  person user2651050    schedule 15.11.2019
comment
Мне интересно, нашли ли вы решение для этого? У меня такие же проблемы.   -  person Cyberpau    schedule 10.06.2020


Ответы (1)


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

загрузить данные переменных в глобальные переменные внутри скрипта

Облачные функции могут использовать один и тот же экземпляр для нескольких вызовов. Таким образом, локальные переменные внутри функции должны быть безопасными для использования, но по-настоящему глобальные переменные могут быть нарушены.

Если у вас по-прежнему возникают проблемы, добавление в ваш вопрос точных данных о проблемах с кодированием может помочь нам лучше.

person Prisoner    schedule 15.11.2019
comment
В приведенном выше фрагменте кода я уже изменил объявление переменной на локальное (внутри блока exports.dialogflowFirebaseFulfillment). Однако это тоже не работает, возможно, огромное количество локальных переменных (сейчас около 30) замедляет работу облака. - person user2651050; 15.11.2019