Zmiana domyślnego trybu trwałości w IndexedDB

W Chrome 121 domyślny tryb trwałości w IndexedDB zmienia się z strict na relaxed. Ta zmiana ma na celu zwiększenie wydajności i dopasowanie do innych najpopularniejszych przeglądarek, takich jak Firefox czy Safari. W poście na blogu znajdziesz szczegółowe informacje o tej zmianie i jej skutkach dla programistów stron internetowych.

Tryby trwałości IndexedDB

IndexedDB, zaawansowany interfejs API do przechowywania dużych ilości uporządkowanych danych, ma 2 tryby trwałości w przypadku transakcji readwrite:

  • strict: ten tryb wyraźnie instruuje system operacyjny, aby wyczyścić zmiany na dysku przed uruchomieniem zdarzenia complete.
  • relaxed Ten tryb zależy od domyślnego działania opróżniania systemu operacyjnego i wysyła zdarzenie complete po wprowadzeniu zmian do bufora systemu operacyjnego, który jest zwykle usuwany co kilka sekund.

Pamiętaj, że strict nie gwarantuje, że zmiany zostaną faktycznie natychmiast zapisane na dysku. Po wywołaniu funkcji put() strona jeszcze przez pewien czas może utracić zasilanie, które może spowodować, że zmiana nie zapisze się na dysku i nie zostanie usunięta przy następnym uruchomieniu aplikacji.

W przypadku gwarancji o trwałości strict zdarzenie complete transakcji IndexedDB jest wywoływane po faktycznym zapisaniu danych. Natomiast w przypadku trwałości relaxed dane są nadal w procesie zapisywania po wywołaniu zdarzenia complete. (Więcej informacji o całym procesie znajdziesz w tym wyjaśnieniu).

Dlatego tak naprawdę strict przydaje się tylko w przypadku operacji, w przypadku których koniecznie musisz wiedzieć, że został napisany, zanim wykonasz kolejną czynność. Przykładem, w którym strict jest wytrzymałość, jest migracja danych. Podczas przenoszenia danych z jednego magazynu kopii zapasowych do innego nie chcesz usuwać starego formatu, dopóki nie zostanie zapisany nowy format. W ten sposób trwałość strict ułatwia rutynę migracji, która może zostać cofnięta po awarii w połowie migracji.

Zmiana domyślnego trybu trwałości

Najważniejszym aspektem tej zmiany jest domyślny tryb trwałości w przypadku transakcji readwrite w Chrome. Do tej pory wartość domyślna to strict, co zapewnia natychmiastowe zapisywanie na dysku w przypadku zmian danych. Jednak ze względu na kwestie związane z wydajnością oraz aby dostosować się do innych najpopularniejszych przeglądarek, z których wszystkie korzystają z relaxed, Chrome także planuje zmienić ustawienie domyślne na relaxed.

Ta zmiana ma zapewnić lepszą równowagę między wydajnością a trwałością danych. Chociaż zasada strict zapewnia maksymalną trwałość danych, relaxed często wystarcza do wielu aplikacji internetowych i może znacznie poprawić wydajność w następujący sposób:

  • Szybkość – na rzeczywistych przykładach zespół Chrome zauważył wzrost szybkości między 3 a 30.
  • trwałość dysku, zwłaszcza w przypadku urządzeń z dyskiem SSD.
  • Wydłużona żywotność baterii.
  • Poprawiona szybkość odczytu. Ze względu na architekturę IndexedDB, gdzie transakcje odczytu są często blokowane w ramach transakcji zapisu, szybkość odczytu jest dodatkowo zwiększana.
  • Ma to pozytywny wpływ na całe urządzenie, bo operacje na dysku są współdzielonym zasobem systemowym.

Współdziałanie i zgodność

Ważnym aspektem tej zmiany jest jej wpływ na interoperacyjność i zgodność. Dopasowując się do zachowań innych popularnych dostawców przeglądarek, Chromium zwiększa interoperacyjność. Sam standard zezwala na różne implementacje, a ta zmiana ma na celu ich harmonizację. Kontekst historyczny znajdziesz w tym problemie na GitHubie.

Co to oznacza dla programistów stron internetowych?

Ta zmiana nie wprowadza żadnych nowych interfejsów API. Istniejący interfejs IndexedDB API pozostaje bez zmian, a ta zmiana wpływa głównie na domyślne działanie transakcji readwrite. Podczas tworzenia transakcji możesz określić preferowany tryb trwałości, co zapewnia kontrolę nad trwałością i wydajnością danych. Poniższy przykładowy kod pokazuje, jak przywrócić stare zachowanie przez ustawienie durability na strict w tablicy opcji.

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

Testowanie zmiany lokalnie przed jej wysłaniem

Zmiana zacznie obowiązywać w Chrome 121. Jeśli chcesz wcześniej przetestować nowe działanie lokalnie, włącz flagę #indexed-db-default-durability-relaxed w narzędziu chrome://flags.

Więcej informacji

Więcej szczegółów technicznych i aktualności dotyczących tej zmiany znajdziesz na stronach o błędzie śledzenia i wpisie o stanie platformy Chrome.

Podsumowując, przejście w Chrome na zmianę domyślnego trybu trwałości w IndexedDB ma na celu poprawę wydajności przy zachowaniu zgodności z innymi najpopularniejszymi przeglądarkami. W większości przypadków zalecamy nie podejmować żadnych działań, ponieważ nowe ustawienia domyślne zapewnią lepszą wydajność. W razie potrzeby możesz dalej określać preferowany tryb trwałości, przejmując kontrolę nad trwałością i wydajnością danych w aplikacjach internetowych.

Podziękowania

Artykuł napisali Evan Stade i Rachel Andrew.