IndexedDBの安全な永続化リソース管理戦略 ~ 有効期限と容量制限

IndexedDBはキャッシュによる通信の削減の用途に非常に魅力的だが、クライアント/ユーザー側にサーバー/サービス提供者側から管理・修正不能な状態を作るリスクがあり、最悪の場合クライアント/ユーザー側でキャッシュを削除しない限りサービスが利用不能となる可能性がある。これはサービスの規模および継続性に比例して許容できないリスクとなる。

管理・修正不能である不正な状態は不整合データによるエラーまたはリソース(削除)漏れによるキャパシティーオーバーが主な原因として懸念されるが、これは通常、有効期限の機能追加により解決できる。

データの不整合をそもそも仕様と一致しない不整合と互換性のないバージョン間の不整合の2つに大別すると、仕様外不整合は開発者が逐次バリデーションにより検知対処すべきものであり永続化の問題ではなく、バージョン間不整合は不整合をどう解決するにしても不整合の解決自体はアプリケーションレベルの問題でありその余は古いデータの削除としてリソース漏れの問題に統合でき、サーバー管理下にない永続化リソースの管理に関する問題は古いまたは余分なデータをいかに処分するかという問題に帰結する。なおバージョン間不整合の主な解決方法はトランザクションによる厳格な操作およびマイグレーションか、バージョンごとのキーの変更(バージョンをキーに含める)の2つが考えられる。

削除前のマイグレーション等の対応は開発者の責務として、共通する普遍的な問題は古いデータの削除である。開発者から認識されず、または無視される管理外データを自動的に削除する機能がIndexedDBをプロダクションで使うために必須となる。有効期限と容量制限は管理外データ、ひいてはこれを管理する問題のサイズに上限を与え、管理可能なサイズに縮小する。使わないデータも古いデータも自動的に消えるなら最新と直近のバージョンのデータだけ考えれば済み、それ以外は放置か削除で足りる。ただし、エラーをおこすデータは適宜削除する必要があるだろう。

このように有効期限と容量制限(超過データの自動削除)の制約を与えることでサーバー管理下にない永続化リソースも相当程度安全に利用できるものとなる。古いデータの書き込みや制約適用前のデータ読み込みなどの対処まで考慮すると制約の完全な適用は密結合な設計でなければ難しく作りづらいが、完全に適用したとしてもいずれにせよ旧バージョンの処理を停止しアップデートを要求しなければならないため、これは同じ対処をバリデーションにより行うほうが簡潔であるし、複雑なバージョン管理に由来するバリデーションやマイグレーションの失敗もブラウザの再起動によりバージョンを最新にそろえればほとんど解決するので通常のバグ対応の範疇であり、サポートも容易である。

IndexedDBはサーバー管理下にない永続化リソースの制御の難しさから採用しづらいものであったが、有効期限と容量制限の制約を自律させることで採用を検討できる安全性が得られる。以下のライブラリはこの2つの制約を実装したものである。

github.com