Node.js, asenkron yapısı ve olay tabanlı programlama tarzıyla hızla popülerleşti. Ancak bu yapının getirdiği bazı zorluklar da var. Bu yazıda bahsedeceğimiz problem de bunlardan biri: EventEmitter Memory Leak uyarısı.
EventEmitter Memory Leak Uyarısı Nedir?
Ama merak etmeyin! Bu problemi nasıl çözeceğinizi size adım adım anlatacağım.
Neden Bu Uyarıyı Alırsınız?
- Dinleyiciler düzgün bir şekilde kaldırılmamış.
- Aynı olaya birden fazla dinleyici eklenmiş.
- EventEmitter nesnesinin fazla sayıda event listener’ı olmuş.
Örneğin, uygulamanızda belirli bir işlem tamamlandıktan sonra belirli bir olayı dinlemek için event listener ekliyorsunuz. Ancak işlem sonunda bu dinleyici temizlenmiyor, bu da her defasında yeni bir dinleyici eklenmesine ve zamanla bellek sızıntısına yol açabiliyor.
Bu Uyarıyı Nasıl Çözüme Kavuşturursunuz?
İlk olarak, `EventEmitter`'ı kullanırken her dinleyici eklediğinizde, dinleyiciyi kaldırmayı unutmamalısınız.
# Örnek Kod
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
// Dinleyici ekliyoruz
const listener = () => {
console.log('Event triggered!');
};
myEmitter.on('event', listener);
// Olayı tetikliyoruz
myEmitter.emit('event');
// Dinleyiciyi kaldırıyoruz
myEmitter.removeListener('event', listener);
// Olayı tekrar tetikleyelim, dinleyici kaldırıldığı için bir şey yazdırılmaz
myEmitter.emit('event');
Yukarıdaki örnekte, önce `event` olayına bir dinleyici ekliyoruz ve ardından bu dinleyiciyi `removeListener` yöntemi ile kaldırıyoruz. Eğer dinleyici kaldırılmasaydı, her `emit` çağrısında konsola "Event triggered!" yazısı görmeye devam edecektik.
EventEmitter'da Max Dinleyici Sayısını Artırmak
Dinleyici sınırını değiştirmek için:
const myEmitter = new EventEmitter();
// Dinleyici sınırını arttırıyoruz
myEmitter.setMaxListeners(20);
Bu şekilde, dinleyici sınırını 20'ye çıkarabiliriz. Ancak, dediğim gibi, uygulamanızda gereksiz yere çok fazla dinleyici olmasından kaçının.
EventEmitter'da Dinleyici Sayısını İzlemek
const listenerCount = myEmitter.listenerCount('event');
console.log(`Event has ${listenerCount} listeners.`);
Bu kod, belirli bir olayın kaç tane dinleyicisi olduğunu gösterir. Böylece fazla dinleyici eklendiğini fark edebilir ve gerektiğinde müdahale edebilirsiniz.
Sonuç: Memory Leak Sorununu Çözmek
Bu basit tekniklerle, uygulamanızda bellek sızıntısı sorunlarını çözebilir ve daha sağlıklı bir performans elde edebilirsiniz. Node.js ile kod yazarken bu tür ince detayları gözden kaçırmamak, uzun vadede projenizin sağlıklı bir şekilde büyümesine yardımcı olur.