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
メソッドをよんじゃいましょう。
ちなみにリクエスト内でデータを更新する場合も心配無用です。キャッシュするためのプロパティであるthisPersistentAttribuets
はsetPersistentAttribuets
を実行した際に更新されます。
なのでリクエスト内でのデータの引き回しだけを考えると、setPersistentAttributes
だけ実行しておけば、以降の処理でgetPersistentAttribuets
を実行しても更新されたデータが取れるようにつくられています。
パフォーマンスのことを考えるのであれば、savePersistentAttributes
は最後にまとめて1度だけ呼び出すようにするのがよさそうです。
ちなみに
「スキル以外からのデータ更新がある場合」や「他のユーザーからの操作でもデータが変わる場合」など、キャッシュを使いたく無い場合もあります。
そんな時は、getPersistentAttributes(false)
としてやればキャッシュを作らなくなります。