20 puan yazan GN⁺ 2024-11-13 | Henüz yorum yok. | WhatsApp'ta paylaş
  • Web Locks API, bir sekmede veya web worker içinde asenkron olarak kilit edinmeyi, işi yaptıktan sonra da kilidi bırakmayı sağlar
  • Kilit tutulduğu sürece aynı origin içindeki diğer script'ler aynı kilidi alamaz; böylece birden fazla sekme veya worker arasında kaynaklar güvenli şekilde koordine edilebilir
  • Yalnızca Secure Context(HTTPS) içinde kullanılabilir ve Web Workers'ta da kullanılabilir

Temel kavramlar ve kullanım şekli

  • Kilit(Lock), web uygulamasında tanımlanan bir adla ayırt edilen soyut bir kaynaktır
  • Örneğin birden fazla sekmede IndexedDB ve ağ senkronizasyonu yapılırken, "my_net_db_sync" adlı bir kilit kullanılarak aynı anda yalnızca tek bir sekmenin senkronizasyon yapması sağlanabilir
  • Kullanım akışı:
    1. Kilit isteği
    2. Asenkron işi yürütme
    3. İş tamamlandıktan sonra kilidin otomatik olarak bırakılması

Örnek kod

navigator.locks.request("my_resource", async (lock) => {
await do_something();
await do_something_else();
});

  • Kilit tutulurken aynı kilit için gelen diğer istekler kuyruğa eklenir; kilit bırakıldığında ilk istek işlenir

Seçenekler

  • mode: Varsayılan mod "exclusive"(özel/tekil) olup, "shared"(paylaşımlı) modu da mümkündür. "exclusive" yalnızca tek bir isteğe izin verir, "shared" ise birden fazlasına izin verebilir
  • ifAvailable: Kilit hemen alınamıyorsa istek başarısız olur, callback null döndürür
  • steal: Aynı adlı mevcut kilidi sonlandırır ve yeni isteği öncelikli olarak işler
  • signal: İstek, AbortSignal üzerinden iptal edilebilir (ör. timeout uygulamak için)

İzleme

  • navigator.locks.query() kullanılarak mevcut origin'in kilit durumu sorgulanabilir
  • Bu, debug sırasında faydalıdır; hangi kilitlerin tutulduğunu ve hangi kilitlerin istendiğini görmeyi sağlar

Gelişmiş kullanım

  • Asenkron işin tamamlanma anını açıkça kontrol etmek için Promise döndürülebilir

let resolve;
const p = new Promise((res) => { resolve = res });

navigator.locks.request("my_resource", (lock) => p);

  • resolve() çağrıldığında kilit bırakılır

Deadlock önleme

  • Deadlock, farklı isteklerin sıra problemi nedeniyle çakışıp ilerlemenin imkânsız hale geldiği durumdur
  • Örneğin sekme 1 kilit A'ya, sekme 2 ise kilit B'ye sahipken; sekme 1 kilit B'yi, sekme 2 de kilit A'yı isterse ikisi de birbirini bekler
  • Bunu önlemek için:
  • Kilit isteklerini iç içe geçirmeyin
  • Kilit isteklerini belirli bir sırayla ilerletin
  • İsteği iptal etmek için timeout ayarlayın

Arayüzler

  • Lock: İstenen kilidin adını ve modunu sağlar
  • LockManager: Yeni kilit isteme veya mevcut kilitleri sorgulama yöntemleri sağlar
  • Örnek, navigator.locks üzerinden alınabilir
  • WorkerNavigator.locks, Web Workers içinde kullanılabilir

Spesifikasyon ve tarayıcı desteği

  • Spesifikasyon: Web Locks API
  • Tarayıcı uyumluluğu: Yalnızca bazı tarayıcılarda desteklenir; güncel tarayıcı desteği MDN üzerinden kontrol edilebilir

GN⁺ görüşü

  • Web Locks API, asenkron ortamlarda kaynak senkronizasyonu sorunlarını çözmek için yararlıdır
  • Deadlock oluşma ihtimali bulunduğundan kullanım sırasında dikkat gerekir; timeout gibi güvenlik önlemleri düşünülmelidir
  • Shared mode, salt okunur işlerde performansı artırabilir; ancak yine de race condition olasılığı dikkatle değerlendirilmelidir
  • Bu API, localStorage veya IndexedDB'deki senkronizasyon sorunlarını çözmek için alternatif olarak kullanılabilir

Henüz yorum yok.

Henüz yorum yok.