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)としてやればキャッシュを作らなくなります。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark