IndexedDB のデフォルトの耐久性モードの変更

Chrome 121 以降、IndexedDB のデフォルトの耐久性モードが strict から relaxed に変更されます。この調整は、Firefox や Safari など他の主要なブラウザに合わせてパフォーマンスを高めるためのものです。このブログ投稿では、この変更の詳細とウェブ デベロッパーへの影響について説明しています。

IndexedDB 永続性モード

IndexedDB は、大量の構造化データを保存するための強力なウェブ API であり、readwrite トランザクションに次の 2 つの永続性モードがあります。

  • strict: このモードでは、complete イベントを発行する前にディスクに対する変更をフラッシュするように OS に明示的に指示されます。
  • relaxed このモードではデフォルトの OS フラッシュ動作を利用し、OS バッファに変更が行われた後に complete イベントを発行します。通常、このバッファは数秒ごとにフラッシュされます。

なお、strict では、変更内容が実際にディスクにすぐに書き込まれるとは限りません。サイトが put() を呼び出した後も、停電によって変更内容がディスクに反映されず、次回のアプリ実行で欠落する可能性がある有限の時間は引き続き存在します。

strict の永続性を保証する場合、IndexedDB トランザクションの complete イベントは、データが実際に書き込まれた後に呼び出されませんが、relaxed の永続性の場合、complete イベントが発生したとき、データはまだ書き込みプロセス中です。(プロセス全体の詳細については、こちらの説明を参照してください)。

したがって、strict は実際には、次に行う前にそれが記述されていることを確実に確認する必要があるオペレーションにのみ使用します。データの移行は、strict の耐久性が求められる一例です。バッキングストア間で移行する場合、新しい形式が書き込まれるまでは古い形式を削除しないことをおすすめします。このように、strict の耐久性は、途中で障害から回復できる移行ルーチンを容易にします。

デフォルトの耐久性モードの変更

この変更の重要な点は、Chrome の readwrite トランザクションのデフォルトの耐久性モードです。これまでのデフォルトは strict で、データ変更があったときはすぐにディスク書き込みが行われていました。ただし、パフォーマンスを考慮し、relaxed を使用する他の主要なブラウザに合わせて、Chrome でも同様にデフォルトを relaxed に変更する予定です。

この変更は、パフォーマンスとデータ耐久性のバランスを改善することを目的としています。strict によってデータの耐久性が最大化されますが、多くの場合、relaxed は多くのウェブ アプリケーションに十分対応しており、次のようにパフォーマンスを大幅に向上させることができます。

  • 速度 - 実際の例では、Chrome チームの速度は 3 ~ 30 倍向上しています。
  • ディスクの耐久性(特にソリッド ステート ディスク(SSD)を備えたデバイスで)。
  • バッテリーが長持ち。
  • 読み取り速度の改善。読み取りトランザクションが書き込みトランザクションの背後でブロックされることが多い IndexedDB のアーキテクチャでは、二次的な効果として読み取り速度が改善されています。
  • ディスク操作は共有システム リソースであるため、デバイス全体に悪影響が及びます。

相互運用性と互換性

この変更の重要な側面の一つは、相互運用性と互換性への影響です。Chromium は、他の主要なブラウザ ベンダーの動作と統一することで相互運用性を改善しています。標準自体はさまざまな実装を可能にしており、今回の変更はそれらの実装を統一することを目的としています。この変更に関する詳しい履歴情報については、こちらの GitHub の問題をご覧ください。

ウェブ デベロッパーへの影響

この変更により新しい API サーフェスは導入されません。既存の IndexedDB API に変更はありません。この変更は主に、readwrite トランザクションのデフォルトの動作に影響します。トランザクションの作成時に優先される耐久性モードを指定して、データの耐久性とパフォーマンスを制御できます。次のコードサンプルでは、オプションのオプション配列で durabilitystrict に設定して、以前の動作に戻す方法を示します。

let db;
const DBOpenRequest = window.indexedDB.open("toDoList", 4);
DBOpenRequest.onsuccess = (event) => {
  db = DBOpenRequest.result;
};
const transaction = db.transaction(
  ['toDoList'],
  'readwrite',
  { durability: 'strict' });

リリース前にローカルで変更をテストする

この変更は Chrome 121 で有効になります。以前に新しい動作をローカルでテストする場合は、chrome://flags#indexed-db-default-durability-relaxed フラグを切り替えます。

詳細

この変更に関する技術的な詳細と最新情報については、バグの追跡Chrome プラットフォームのステータス エントリをご覧ください。

要約すると、IndexedDB のデフォルトの永続性モードを変更する Chrome の取り組みは、他の主要なブラウザとの互換性を維持しながらパフォーマンスを向上させることを目的としています。新しいデフォルトによってパフォーマンスが向上するため、ほとんどの場合は何もしないことをおすすめします。必要に応じて、引き続き希望の耐久性モードを指定することで、ウェブ アプリケーションでデータの耐久性とパフォーマンスを制御できます。

謝辞

この記事は Evan StadeRachel Andrew によってレビューされました。