Node.js İle Cron Jobs Kullanarak Otomatik Görev Yönetimi Nasıl Yapılır?

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.time veya performance.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_threads modü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; dotenv gibi 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.

Bu yazıya tepkinizi paylaşın:
Burak Şahin

Verimlilik ve organizasyon üzerine uzmanlaşmış bir yazarım. Karmaşık görevleri yönetilebilir parçalara bölerek okuyucunun zamanını doğru kullanmasını sağlıyorum.

Yorumlar (0)

Yorum Yaz