Как я могу поддерживать состояние в навыках Alexa Lambda?

Я пытаюсь написать игру-викторину, в которой Alexa задает 10 случайных вопросов из списка и отслеживает счет, а затем объявляет его. Для этого я использую функцию Node.js Lambda.

Я написал класс QuizMaster, который запускает викторину: он спрашивает пользователя об их предпочтительных категориях и уровне сложности, создает рандомизированный список вопросов с рандомизированными ячейками для ответов A/B/C и проверяет, является ли предоставленный ответ правильным для последнего. - разговорный вопрос.

Вот где для меня все становится сложно: где я могу сохранить ссылку на этот экземпляр QuizMaster? Если я создам его как переменную вне обработчиков намерений, в первый раз он будет работать нормально, но затем мастер викторины все еще будет рядом, если пользователь повторно вызовет навык, и немедленно повторно объявит свой окончательный результат и завершит игру. Это меня немного смущает, потому что моя мысленная модель заключалась в том, что каждый раз, когда происходит попадание в конечную точку Lambda, Amazon работает node index.js, и когда сеанс завершается, выполнение завершается. Но я полагаю, что ошибаюсь — это больше похоже на то, что Amazon запускает node index.js один раз, оставляя его открытым в цикле, прослушивая события, и каждое событие передается функции-обработчику? Так что, если я запущу его дважды подряд, у меня все еще будут старые переменные с их старыми значениями? Означает ли это, что если 10 пользователей запускают мой навык Alexa одновременно, все они будут использовать одни и те же значения для этих переменных/изменять состояние друг друга? Или это будет похоже на то, как AWS запускает файл 10 раз и берет с меня 10-кратный объем памяти за одно выполнение?

Итак, я предполагаю, что я должен хранить состояние в базе данных или напрямую подключаться к сеансу (в Alexa Node SDK, this.attributes). Итак, мне нужно переписать мое приложение таким образом, чтобы я мог сериализовать состояние, прикрепить его к сеансу, а затем извлечь состояние - я не могу хранить экземпляр QuizMaster, чтобы отслеживать вещи для каждого пользователя. сеанс?


person GreenTriangle    schedule 16.01.2018    source источник


Ответы (3)


Мне нужно переписать мое приложение таким образом, чтобы я мог сериализовать состояние, прикрепить его к сеансу, а затем извлечь состояние — я не могу хранить экземпляр QuizMaster, чтобы отслеживать вещи для каждого сеанса пользователя.

Да, это именно то, что вам нужно сделать.

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

Единственный надежный способ сохранить состояние при вызовах — использовать внешнее хранилище, такое как DynamoDB, RDS и т. д.

person Noel Llevares    schedule 16.01.2018
comment
Штопать. Это было моей самой большой заботой. Спасибо. - person Jose A; 13.05.2018

Amazon и многие другие люди опубликовали инструкции и примеры сохранения состояния с помощью DynamoDB. Попробуйте выполнить поиск по «Alexa DynamoDB».

person Ron Lisle    schedule 18.01.2018

Вам не нужно использовать их Node или Java SDK, а также вам не нужно использовать AWD Lambda для размещения ваших ответов о навыках. Я сам размещаю взаимодействие своих навыков на обычном веб-сервере, работающем под управлением Apache/PHP.

Alexa просто требует, чтобы вы отправили ответ JSON.

Я написал свой собственный обработчик, используя только PHP. Это довольно просто. Я даже смог реализовать прогрессивные ответы, когда есть небольшая задержка в возврате данных, запрошенных пользователем. Алекса говорит: «Подожди, пока я посмотрю». поэтому пользователь не думает, что сеанс задержался или закончился. Я отправляю в конечную точку API директив, используя stream_context_create и file_get_contents в PHP, прежде чем запускать поиск. Я также поддерживаю сеанс и состояние, используя переменные сеанса PHP. Сеанс завершается, когда пользователь выходит. Если бы я хотел сохранить текущее состояние конкретного пользователя, я бы просто записал текущее состояние в базу данных MySQL с помощью PHP.

Кто-то написал обработчик PHP для всего этого. Я не использую его, но это хорошее начало для людей, которые лучше знакомы с PHP, чем с Node или Java.

https://github.com/Fever905/amazon-alexa-php

Мой немного другой. Для поддержания моих сеансов я использую следующий код:

 $json = file_get_contents('php://input');
 $data = json_decode($json);

 $sessionid = str_replace("amzn1.echo-api.session.","",$data->session->sessionId);

 session_id($sessionid);
 session_start();

Это позволяет мне хранить переменные сеанса, такие как $_SESSION['count'] = 10; которые сохраняются на протяжении всего сеанса пользователя в моем навыке.

person Michael Fever    schedule 10.01.2019