Gereksinimler ve Ortam Kurulumu
Uygulamaya başlamadan önce sisteminizde Node.js'in güncel bir sürümünün (2026 itibarıyla LTS sürümü olan 22.x veya üzeri önerilir) kurulu olması gerekmektedir. Proje dizininizi oluşturun ve gerekli bağımlılıkları yükleyin.
# Proje dizinini oluşturun
mkdir cron-projesi
cd cron-projesi
# Node.js projesini başlatın
npm init -y
# node-cron kütüphanesini kurun
npm install node-cron
Bu komutlar, projenizin temelini atar ve zamanlanmış görevleri yönetmemizi sağlayacak olan node-cron paketini projenize dahil eder. node-cron, Linux üzerindeki standart 'cron' yapısını Node.js dünyasına taşıyan, oldukça hafif ve performanslı bir kütüphanedir.
Cron Sözdizimini Anlamak
Cron zamanlamaları beş farklı yıldız karakterinden oluşur. Her bir yıldız, zamanın belirli bir birimini temsil eder. Bu yapıyı doğru kurmak, görevlerinizin tam istediğiniz vakitte çalışmasını sağlar.
Sözdizimi sırası şöyledir: Dakika (0-59), Saat (0-23), Ayın günü (1-31), Ay (1-12), Haftanın günü (0-7, 0 ve 7 pazar günüdür).
# Cron yapısı örneği:
# * * * * * *
# | | | | | |
# | | | | | +-- Haftanın günü (0 - 7)
# | | | | +---- Ay (1 - 12)
# | | | +------ Ayın günü (1 - 31)
# | | +-------- Saat (0 - 23)
# | +---------- Dakika (0 - 59)
# +------------ Saniye (Opsiyonel)
Adım Adım İlk Cron Job Uygulamasını Oluşturma
İlk görevimizi oluşturarak sistemin nasıl çalıştığını test edelim. Bu örnekte, her dakika başı konsola bir mesaj yazdıran basit bir görev tanımlayacağız.
const cron = require('node-cron');
// Her dakikada bir çalışacak görev
cron.schedule('* * * * *', () => {
console.log('Görev çalıştırıldı: ' + new Date().toLocaleString());
});
Bu kod bloğu, node-cron kütüphanesini içe aktarır ve schedule fonksiyonu ile zamanlamayı tanımlar. * * * * * ifadesi, "her dakikanın her saniyesinde" anlamını taşır. Uygulamayı node index.js komutuyla çalıştırdığınızda, her dakika konsolda zaman damgasını göreceksiniz.
Gelişmiş Zamanlama Teknikleri
Zamanlamalar her zaman "her dakika" gibi basit olmayabilir. Belirli bir saatte, günün belirli aralıklarında veya haftanın belirli günlerinde görev çalıştırmak için cron sözdizimini özelleştirebilirsiniz.
// Her gün saat 03:30'da çalışacak görev
cron.schedule('30 3 * * *', () => {
console.log('Gece yarısı veritabanı temizliği başladı.');
});
// Her Pazartesi saat 09:00'da çalışacak görev
cron.schedule('0 9 * * 1', () => {
console.log('Haftalık rapor oluşturuluyor.');
});
Bu örneklerde, ilk parametre olan zaman dizgisi (string) değiştirilerek görevlerin çalışma periyodu tam olarak kontrol edilmiştir. Bu yöntem, özellikle sunucu yükünün az olduğu gece saatlerinde ağır işlemler yapmak için idealdir.
Görev Yönetimi: Başlatma, Durdurma ve Kontrol
Bazen bir görevi dinamik olarak durdurmanız veya koşullara bağlı olarak başlatmanız gerekebilir. node-cron, döndürdüğü nesne üzerinden görev yönetimi yapmanıza olanak tanır.
const gorev = cron.schedule('* * * * *', () => {
console.log('Bu görev dinamik olarak kontrol ediliyor.');
}, {
scheduled: false // Otomatik başlamasını engelle
});
// Görevi başlat
gorev.start();
// 5 dakika sonra görevi durdur
setTimeout(() => {
gorev.stop();
console.log('Görev durduruldu.');
}, 300000);
Bu yaklaşım, uygulamanızın çalışma süresi boyunca görevleri yönetmenizi sağlar. scheduled: false parametresi, görevin tanımlandığı anda değil, sizin start() komutunuzla tetiklenmesini sağlar.
Karşılaştırma: Zamanlanmış Görev Yöntemleri
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| node-cron | Node.js içinde kolay entegrasyon | Uygulama çökerse görev çalışmaz |
| OS Cron Jobs | İşletim sistemi seviyesinde kararlılık | Node.js ortamına erişim zorluğu |
| BullMQ (Redis) | Dağıtık sistemler için ölçeklenebilir | Redis bağımlılığı gerektirir |
Kritik Uyarı: Üretim (production) ortamlarında, Node.js sürecinin (process) beklenmedik şekilde sonlanması durumunda cron görevleriniz çalışmayacaktır. Bu nedenle, kritik görevler için PM2 gibi süreç yöneticileri kullanmalı veya görevleri Redis tabanlı kuyruk sistemlerine (BullMQ gibi) taşımalısınız.
Sıkça Sorulan Sorular
Cron görevlerim neden çalışmıyor?
Öncelikle zamanlama sözdizimini kontrol edin. Ayrıca, uygulamanın çalıştığı sunucunun saat dilimini (timezone) doğrulayın. Node.js süreci arka planda çalışıyor mu diye kontrol etmek için süreç yöneticilerini (PM2) inceleyin.
Aynı anda birden fazla görev çalıştırabilir miyim?
Evet, cron.schedule fonksiyonunu istediğiniz kadar farklı zamanlama ve görev ile çağırabilirsiniz. Her biri bağımsız birer zamanlayıcı olarak çalışacaktır.
Görevler veritabanı bağlantısını nasıl etkiler?
Eğer görevleriniz uzun sürüyorsa, veritabanı havuzunuzu (connection pool) tüketebilir. Her görev içinde bağlantıyı açıp kapatmak yerine, bağlantı havuzunu yeniden kullanmaya özen gösterin.
Cron görevlerinde hata yönetimi nasıl yapılır?
Her zaman try-catch blokları kullanın. Görev içinde oluşabilecek bir hata, Node.js ana sürecini durdurmamalıdır. Hataları log dosyalarına yazarak izlenebilirliği artırın.
Saniye bazlı zamanlama mümkün mü?
Evet, node-cron kütüphanesi 6 parametreli sözdizimini destekler. İlk parametre saniyeyi temsil eder. Ancak, çok sık çalışan (her saniye) görevlerin sistem kaynaklarını tüketeceğini unutmayın.
Dağıtık Sistemlerde Cron Job Yönetimi ve Ölçeklenebilirlik
Uygulamanızı tek bir sunucuda çalıştırdığınız sürece node-cron veya benzeri kütüphaneler oldukça verimlidir. Ancak, uygulamanız yatay ölçeklenerek birden fazla sunucu (instance) üzerinde çalışmaya başladığında, aynı cron görevinin her sunucuda aynı anda tetiklenmesi veri tutarsızlıklarına veya mükerrer işleme (duplicate processing) yol açabilir. Bu sorunu çözmek için "Dağıtık Kilitleme" (Distributed Locking) mekanizmalarını kullanmalısınız.
Redis kullanarak bir görevin sadece bir sunucuda çalışmasını sağlamak için redlock kütüphanesinden faydalanabilirsiniz:
const Redlock = require('redlock');
const Redis = require('ioredis');
const redis = new Redis();
const redlock = new Redlock([redis]);
async function runDistributedTask() {
const lock = await redlock.acquire(['locks:my-cron-job'], 5000);
try {
console.log("Görev sadece bu sunucuda çalışıyor.");
// İş mantığınız burada yer almalı
} catch (err) {
console.log("Görev başka bir sunucu tarafından kilitlenmiş.");
} finally {
await lock.release();
}
}
Cron Görevleri İçin Test Stratejileri
Zamanlanmış görevlerin test edilmesi, geleneksel API testlerinden farklıdır çünkü görevlerin tetiklenmesini beklemek yerine, zamanı manipüle etmeniz gerekir. sinon gibi kütüphanelerle "sahte zamanlayıcılar" (fake timers) kullanarak, saatler süren bir görevi milisaniyeler içinde test edebilirsiniz.
Zaman Tabanlı Test Örneği
Aşağıdaki örnekte, sinon kullanarak zamanı ileri sarıp, görevin tetiklenip tetiklenmediğini doğruluyoruz:
const sinon = require('sinon');
const assert = require('assert');
describe('Cron Job Testi', () => {
let clock;
before(() => {
clock = sinon.useFakeTimers();
});
after(() => {
clock.restore();
});
it('görev 1 saat sonra tetiklenmeli', () => {
const callback = sinon.spy();
// Görevi simüle et
setTimeout(callback, 3600000);
clock.tick(3600000); // Zamanı 1 saat ileri sar
assert(callback.calledOnce);
});
});
Performans İzleme ve Loglama
Uzun süren cron görevleri, Node.js'in tek iş parçacıklı (single-threaded) yapısı nedeniyle Event Loop'u bloklayabilir. Bu durum, uygulamanızın HTTP yanıt sürelerini olumsuz etkiler. Görevlerinizin performansını izlemek için şu stratejileri uygulayın:
- İzleme (Tracing): Görevlerin başlama ve bitiş zamanlarını
console.timeveyaperformance.now()ile ölçün. - Async/Await Kullanımı: Ağ veya veritabanı işlemlerinde mutlaka asenkron yöntemleri tercih edin.
- Worker Threads: Eğer göreviniz CPU yoğunluklu (görüntü işleme, veri analizi vb.) bir işlemse, bu görevi ana iş parçacığından ayırarak
worker_threadsmodülüne devredin.
Özellikle kritik görevleriniz için winston veya pino gibi yapılandırılmış loglama kütüphaneleri kullanarak, hataları merkezi bir log yönetim sistemine (ELK Stack veya Datadog gibi) aktarmanız, üretim ortamındaki sorunları hızlıca teşhis etmenizi sağlar.
Sonuç
Node.js ile cron jobs kullanarak otomatik görev yönetimi yapmak, uygulamalarınızın verimliliğini artıran temel bir yetenektir. Basit zamanlamalardan başlayarak, süreç yönetimi ve hata yakalama mekanizmalarıyla sisteminizi daha güvenilir hale getirebilirsiniz. Bir sonraki adım olarak, görevlerinizi veritabanı kayıtlarıyla ilişkilendirmeyi ve görev geçmişini tutan bir loglama sistemi kurmayı deneyebilirsiniz.
Güvenlik Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamında çalıştıracağınız görevlerde, veritabanı erişim bilgilerinizi asla kod içerisinde açık bırakmayın;
dotenvgibi ortam değişkeni yönetim araçlarını kullanın. Ayrıca, dışarıdan tetiklenebilen görevlerde yetkilendirme ve doğrulama kontrollerini mutlaka uygulayın.


Yorumlar (0)
Yorum Yaz