Amazon Alexaask-sdk

ask-sdkでPersistentAttributesを使う場合のキャッシュ管理

コードを見ていて気づいたのですが、いつの間にかAttributesManager内でPersistentAttribuetsをキャッシュする仕組みが実装されていました。 Gitのログを見る限りでは2019/4ごろの様子で […]

広告ここから
広告ここまで

コードを見ていて気づいたのですが、いつの間にかAttributesManager内でPersistentAttribuetsをキャッシュする仕組みが実装されていました。

// via: https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs/blob/2.0.x/ask-sdk-core/lib/attributes/AttributesManagerFactory.ts#L56-L69


            async getPersistentAttributes(useSessionCache : boolean = true) : Promise<{[key : string] : any}> {
                if (!options.persistenceAdapter) {
                    throw createAskSdkError(
                        'AttributesManager',
                        'Cannot get PersistentAttributes without PersistenceManager');
                }

                // キャッシュがない時またはオフにしている時だけDBに接続する
                if (!persistentAttributesSet || !useSessionCache) {
                    thisPersistentAttributes = await options.persistenceAdapter.getAttributes(options.requestEnvelope);
                    persistentAttributesSet = true;
                }

                return thisPersistentAttributes;
            },

Gitのログを見る限りでは2019/4ごろの様子です。 -> https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs/pull/547

どういう動きをしているか

AttributesManagerの中でPersistentAttributesとして取得した値を保持し、もしデータがあるならそれを利用するという形をとっている様子です。

リクエスト毎に初期化される場所ですので、「PersistenceAdapterを利用したDynamoDB / S3へのGetリクエストは1リクエストにつき1度だけ」という風に考えることができそうです。

スキル開発時のポイント

身もふたもない話ですが、「DynamoDB / S3にアクセスするから、PersistentAttributeへのアクセスは最小限にしよう」という配慮する必要がなくなっています。

パフォーマンスのために、頑張って自前で取得したデータをsessionAttributesやrequestAttributesに保存して使うみたいなことをやる必要はありません。ばんばんgetPersistentAttributesメソッドをよんじゃいましょう。

ちなみにリクエスト内でデータを更新する場合も心配無用です。キャッシュするためのプロパティであるthisPersistentAttribuetssetPersistentAttribuetsを実行した際に更新されます。

なのでリクエスト内でのデータの引き回しだけを考えると、setPersistentAttributesだけ実行しておけば、以降の処理でgetPersistentAttribuetsを実行しても更新されたデータが取れるようにつくられています。

パフォーマンスのことを考えるのであれば、savePersistentAttributesは最後にまとめて1度だけ呼び出すようにするのがよさそうです。

ちなみに

「スキル以外からのデータ更新がある場合」や「他のユーザーからの操作でもデータが変わる場合」など、キャッシュを使いたく無い場合もあります。

そんな時は、getPersistentAttributes(false)としてやればキャッシュを作らなくなります。

ブックマークや限定記事(予定)など

WP Kyotoサポーター募集中

WordPressやフロントエンドアプリのホスティング、Algolia・AWSなどのサービス利用料を支援する「WP Kyotoサポーター」を募集しています。
月額または年額の有料プランを契約すると、ブックマーク機能などのサポーター限定機能がご利用いただけます。

14日間のトライアルも用意しておりますので、「このサイトよく見るな」という方はぜひご検討ください。

広告ここから
広告ここまで

Related Category posts