Web Locks API
(developer.mozilla.org)- 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ışı:
- Kilit isteği
- Asenkron işi yürütme
- İş 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.