Kural
Serbest Bırakma kilitleri hatta kilitler istisna yollarda.
Her kilit kilit mutlaka içermelidir bir garantili
serbest bırakma, hatta istisnalar istisnalar meydana geldiğinde bile.
Desteklenen diller:** Java, C, C++, PHP, JavaScript,
TypeScript, Go, PythonGiriş
Serbest bırakılmamış kilitler, üretim ortamındaki Node.js uygulamalarında kilitlenme ve sistem donmalarının en yaygın nedenlerinden biridir. Kilidin alınması ile serbest bırakılması arasında bir istisna meydana geldiğinde, kilit süresiz olarak tutulmaya devam eder. Bu kilidi bekleyen diğer asenkron işlemler sonsuza kadar askıda kalır ve sistem genelinde zincirleme arızalara yol açar. Tek bir serbest bırakılmamış mutex, olay döngüsünün tıkanmasına ve isteklerin birikmesine neden olarak tüm API’yi çökertebilir. Bu durum, aşağıdaki gibi kütüphanelerde görülür: async-mutex, mutexify, ya da kilidin otomatik olarak açılmadığı herhangi bir manuel kilit sistemi.
Neden önemli?
Sistem kararlılığı ve erişilebilirliği: Serbest bırakılmayan kilitler, Node.js’de asenkron işlemleri donduran kilitlenmelere (deadlock) neden olur. Express veya Fastify sunucularında bu durum, kullanılabilir iş parçacıklarını tüketir ve uygulamanın yeni istekleri işleyememesine yol açar. Tek çözüm, işlemi yeniden başlatmaktır; bu da hizmet kesintisine neden olur. Mikro hizmet mimarilerinde, bir hizmetteki serbest bırakılmayan kilitler, yanıt beklerken zaman aşımına uğrayan bağımlı hizmetlerde arka arkaya arızalara yol açabilir.
Performans düşüşü: Tam bir kilitlenme durumuna gelinmeden önce, serbest bırakılmamış kilitler ciddi performans sorunlarına yol açar. Asenkron işlemler, kilitli kaynaklar için rekabet eder ve hiçbir zaman sonuçlanmayan bekleyen vaatlerden oluşan bir kuyruk oluşturur. Kilit rekabeti, kullanıcı deneyimini bozan öngörülemez gecikme artışlarına neden olur. Yük altında eşzamanlı istek sayısı arttıkça, bu rekabet katlanarak artar.
Hata ayıklama karmaşıklığı: Serbest bırakılmamış kilitlerden kaynaklanan kilitlenmelerin, üretim ortamındaki Node.js uygulamalarında hata ayıklanması oldukça zordur. Belirtiler asıl sorunun kaynağından oldukça uzakta ortaya çıkar; işlemler askıda kalır ve bekleyen vaatler gösterilir, ancak kilidi serbest bırakmada hangi istisna yolunun başarısız olduğu belli olmaz. Kilitlenmeyi tetikleyen istisnaların tam sırasını geliştirme ortamlarında yeniden oluşturmak genellikle imkânsızdır.
Kaynak tükenmesi: Kilitlerin kendilerinin ötesinde, kilitlerin serbest bırakılmaması genellikle veritabanı bağlantıları, Redis istemcileri veya dosya tanıtıcıları gibi diğer kaynakların serbest bırakılmamasıyla bağlantılıdır. Bu durum sorunu daha da ağırlaştırarak, yük altında sistemlerin daha hızlı çökmesine neden olan çok sayıda kaynak sızıntısına yol açar.
Kod örnekleri
❌ Uygun değil:
const { Mutex } = require('async-mutex');
const accountMutex = new Mutex();
async function transferFunds(from, to, amount) {
await accountMutex.acquire();
if (from.balance < amount) {
throw new Error('Insufficient funds');
}
from.balance -= amount;
to.balance += amount;
accountMutex.release();
}
Neden güvenli değil: Eğer “yetersiz bakiye” hatası veriliyorsa, accountMutex.release() asla yürütülmez ve mutex sonsuza kadar kilitli kalır. Bundan sonraki tüm transferFunds() mutex’i beklerken takılı kalacak ve tüm ödeme sistemini donduracaktır.
✅ Uygunluk:
const { Mutex } = require('async-mutex');
const accountMutex = new Mutex();
async function transferFunds(from, to, amount) {
const release = await accountMutex.acquire();
try {
if (from.balance < amount) {
throw new Error('Insufficient funds');
}
from.balance -= amount;
to.balance += amount;
} catch (error) {
logger.error('Transfer failed', {
fromId: from.id,
toId: to.id,
amount,
error: error.message
});
throw error;
} finally {
release();
}
}Neden güvenlidir: Şu yakalamak block, hatayı yeniden atmadan önce bağlamıyla birlikte günlüğe kaydeder ve sonunda Bu blok, işlemin başarılı olması, bir hata oluşması ya da hatanın catch bloğundan yeniden atılması durumlarında bile mutex serbest bırakma işlevinin yürütülmesini garanti eder. Kilit her zaman serbest bırakılır ve bu sayede kilitlenme durumları önlenir.
Sonuç
Kilidin açılması, işlemin başarılı bir şekilde gerçekleştirilmesine bağlı olmamalı, garanti altına alınmalıdır. Şunu kullanın: try-finally JavaScript’teki bloklar ya da runExclusive() şu tür kütüphaneler tarafından sağlanan yardımcı işlevler: async-mutex. Her kilit edinimi, aynı kod bloğu içinde görülebilen koşulsuz bir serbest bırakma yoluna sahip olmalıdır. Doğru kilit yönetimi isteğe bağlı bir şey değildir; bu, kararlı bir sistem ile yük altında rastgele donan bir sistem arasındaki farkı belirler.

