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

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

IndexedDB の耐久性モード

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

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

strict では、変更が実際にディスクにすぐに書き込まれるとは限りません。サイトが put() を呼び出した後も、停電により変更がディスクに書き込まれず、次回のアプリ実行時に変更が失われる可能性がある期間が残っています。

strict の永続性による保証では、データが実際に書き込まれたに IndexedDB トランザクション complete イベントがトリガーされますが、relaxed の永続性では、complete イベントがトリガーされた時点でデータはまだ書き込み中です。(このプロセスの詳細については、こちらの説明をご覧ください)。

したがって、strict は、次の処理を行う前に書き込みが完了したことを絶対に確認する必要があるオペレーションにのみ使用します。データ移行は、strict の耐久性が必要な例です。バックストア間で移動する場合は、新しい形式が書き込まれるまで古い形式を削除しないでください。これにより、strict の耐久性により、途中で障害が発生した場合に復元できる移行ルーティンが容易になります。

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

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

この変更は、パフォーマンスとデータの耐久性のバランスを改善することを目的としています。strict はデータの耐久性を最大限に確保しますが、多くのウェブ アプリケーションでは relaxed で十分であり、次の方法でパフォーマンスを大幅に向上させることができます。

  • 速度 - 実際の例では、Chrome チームは 3 ~ 30 倍の速度向上を確認しています。
  • ディスクの耐久性(特にソリッド ステート ディスク(SSD)を使用するデバイスの場合)。
  • 長時間駆動バッテリー。
  • 読み取り速度の向上。IndexedDB のアーキテクチャでは、読み取りトランザクションが書き込みトランザクションによってブロックされることがよくあるため、副次的な効果として読み取り速度が向上します。
  • ディスク オペレーションは共有システム リソースであるため、デバイス全体にプラスの効果があります。

相互運用性と互換性

この変更の重要な側面の 1 つは、相互運用性と互換性への影響です。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 が確認しました。