Node.js İle Cron Job Kullanarak Zamanlanmış İşlem Nasıl Yapılır?

Node.js İle Cron Job Kullanarak Zamanlanmış İşlem Nasıl Yapılır?
Node.js İle Cron Job Kullanarak Zamanlanmış İşlem Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Zamanlanmış işlemlerinizi başlatmadan önce sisteminizde Node.js'in güncel bir sürümünün (LTS 2026 önerilir) yüklü olması gerekir. Projenizi oluşturmak ve gerekli paketleri kurmak için aşağıdaki adımları izleyin.

  1. Bilgisayarınızda bir terminal açın ve proje klasörünüzü oluşturun: mkdir cron-projesi && cd cron-projesi
  2. Projenizi başlatın: npm init -y
  3. Zamanlama işlemleri için endüstri standardı olan node-cron kütüphanesini kurun: npm install node-cron

Kurulum tamamlandıktan sonra, projenizin kök dizininde index.js adında bir dosya oluşturarak kodlamaya başlayabilirsiniz.

Cron Sözdizimi ve Temel Yapı

Cron job mantığı, belirli bir zaman desenini (pattern) takip eder. Bu desen, beş farklı alandan oluşur: dakika, saat, gün, ay ve haftanın günü. Node.js'te bu yapıyı anlamak, görevlerinizin tam istediğiniz zamanda çalışmasını sağlar.

// Temel cron yapısı örneği
const cron = require('node-cron');

// Her dakika çalışan görev
cron.schedule('* * * * *', () => {
  console.log('Bu kod her dakika çalışacak.');
});

Yukarıdaki örnekte yer alan * * * * * ifadesi, "her dakika" anlamına gelir. İlk yıldız dakikayı, ikincisi saati temsil eder. Bu yapıyı değiştirerek görevinizi özelleştirebilirsiniz.

Adım Adım İlk Zamanlanmış Görevinizi Oluşturun

Şimdi, belirli bir zaman aralığında çalışan daha profesyonel bir örnek yapalım. Örneğin, her gün sabah saat 08:00'de tetiklenen bir görev tanımlayalım.

const cron = require('node-cron');

// Her gün sabah 08:00'de çalışır
cron.schedule('0 8 * * *', () => {
  console.log('Günlük rapor oluşturma işlemi başladı...');
  // Veritabanı işlemleri burada tetiklenebilir
});

Bu kod bloğu, sunucunuzun saat dilimine göre 08:00 olduğunda tetiklenir. Sunucu saatinin UTC veya yerel saat olduğunu kontrol etmeniz önemlidir.

Zamanlanmış İşlemlerde Hata Yönetimi ve Loglama

Arka planda çalışan işlemlerin hata vermesi durumunda bunları takip etmek kritik öneme sahiptir. Hataları yakalamak için try-catch bloklarını kullanmalı ve çıktıları bir log dosyasına yazmalısınız.

const cron = require('node-cron');
const fs = require('fs');

cron.schedule('*/5 * * * *', () => {
  try {
    console.log('Veritabanı temizliği yapılıyor...');
    // Temizlik işlemleri
  } catch (error) {
    fs.appendFileSync('cron-error.log', `${new Date()}: ${error.message}\n`);
  }
});

Bu yöntemle, işlemin başarısız olduğu durumlarda cron-error.log dosyasına hata detayları yazılır ve sistemin neden durduğu kolayca analiz edilebilir.

Farklı Zamanlama Yöntemlerinin Karşılaştırılması

Node.js içerisinde zamanlanmış işlem yapmak için farklı yaklaşımlar mevcuttur. İhtiyacınıza en uygun olanı seçmek için aşağıdaki tabloyu inceleyebilirsiniz.

Yöntem Avantajı Dezavantajı
node-cron Basit, okunabilir, esnek Tek sunucuda çalışır
BullMQ (Redis) Dağıtık sistemler için ideal Redis bağımlılığı gerektirir
setInterval Ek paket gerektirmez Zaman hassasiyeti düşüktür

Üretim Ortamında Güvenlik ve Performans

Üretim ortamında (production) zamanlanmış işlemlerin kesintisiz çalışması için PM2 gibi bir süreç yöneticisi kullanmalısınız. Ayrıca, aynı anda birden fazla görevin tetiklenmesini engellemek için "lock" mekanizmaları kullanmak gerekebilir.

Kritik Uyarı: Üretim ortamında cron job çalıştırırken, görevin sonsuz döngüye girmemesine dikkat edin. Eğer göreviniz uzun sürüyorsa, bir sonraki çalışma zamanı gelmeden işlemin tamamlandığından emin olun. Ayrıca, veritabanı işlemlerinde mutlaka güvenli sorgular (parameterized queries) kullanarak SQL Injection riskini ortadan kaldırın.
// Güvenli veritabanı sorgusu örneği
const db = require('./db-config');

async function temizle() {
  const query = 'DELETE FROM logs WHERE created_at < $1';
  const values = [new Date(Date.now() - 30 * 24 * 60 * 60 * 1000)];
  await db.query(query, values);
}

Sıkça Sorulan Sorular

Node.js cron job sunucu kapandığında çalışır mı?

Hayır, Node.js uygulaması kapalıysa cron job çalışmaz. Uygulamanızın sürekli çalışır durumda olduğundan emin olmak için PM2 veya Docker gibi araçlar kullanmalısınız.

Bir cron job'ı nasıl durdurabilirim?

cron.schedule fonksiyonu bir nesne döner. Bu nesnenin stop() metodunu çağırarak görevi istediğiniz zaman durdurabilirsiniz.

Aynı anda birden fazla cron job çalıştırabilir miyim?

Evet, her cron.schedule çağrısı yeni bir bağımsız görev oluşturur. İhtiyacınız kadar farklı zamanlamaya sahip görev tanımlayabilirsiniz.

Zaman dilimi (timezone) ayarı nasıl yapılır?

node-cron kütüphanesinde { timezone: "Europe/Istanbul" } parametresini kullanarak görevin yerel saatinize göre çalışmasını sağlayabilirsiniz.

Cron job'lar web sitemi yavaşlatır mı?

Eğer çok ağır işlemler (büyük veri işleme gibi) yapıyorsanız, ana iş parçacığını (main thread) kilitleyebilir. Bu tür işleri worker thread'lere veya ayrı bir mikroservise devretmek en iyi pratiktir.

Cron Job İşlemlerinde Performans Optimizasyonu ve Ölçeklendirme

Zamanlanmış görevleriniz büyüdükçe ve karmaşıklaştıkça, Node.js'in tek iş parçacıklı (single-threaded) yapısı bir darboğaz haline gelebilir. Özellikle ağır veri işleme veya büyük dosya okuma/yazma işlemleri yapan cron job'lar, uygulamanızın yanıt süresini doğrudan etkiler. Performansı korumak için aşağıdaki stratejileri uygulayabilirsiniz:

Worker Threads ile İş Yükünü Dağıtma

CPU yoğunluklu bir görevi ana iş parçacığında çalıştırmak, uygulamanızın o an gelen HTTP isteklerine yanıt verememesine neden olur. Bu durumu önlemek için worker_threads modülünü kullanabilirsiniz.

const { Worker } = require('worker_threads');
const cron = require('node-cron');

cron.schedule('0 0 * * *', () => {
  console.log('Ağır işlem başlatılıyor...');
  const worker = new Worker('./agır-islem.js');
  
  worker.on('message', (msg) => console.log('Sonuç:', msg));
  worker.on('error', (err) => console.error('Hata:', err));
});

Veritabanı Bağlantı Havuzlarını Yönetme

Her cron job tetiklendiğinde yeni bir veritabanı bağlantısı açmak, bağlantı havuzunuzun (connection pool) hızla tükenmesine yol açar. Bağlantılarınızı uygulama başlangıcında tanımlayın ve cron job içerisinde mevcut bağlantıyı yeniden kullanın.

Cron Job Süreçlerinde Hata Ayıklama ve İzleme (Monitoring)

Zamanlanmış görevler arka planda çalıştığı için, hata aldıklarında genellikle gözden kaçarlar. Bir cron job'ın sessizce başarısız olması, veri tutarsızlıklarına veya iş süreçlerinin aksamasına neden olabilir. Profesyonel bir izleme stratejisi için şu adımları izleyin:

Merkezi Loglama ve Alerting Mekanizması

Sadece konsola çıktı vermek yerine, hata durumunda Slack, Discord veya e-posta üzerinden bildirim gönderen bir yapı kurun. winston veya pino gibi loglama kütüphanelerini kullanarak loglarınızı bir dosyaya veya merkezi bir log sunucusuna (ELK stack gibi) aktarın.

const cron = require('node-cron');
const axios = require('axios');

cron.schedule('*/30 * * * *', async () => {
  try {
    await performCriticalTask();
  } catch (error) {
    // Hata durumunda bildirim gönder
    await axios.post('https://hooks.slack.com/services/webhook-url', {
      text: `KRİTİK HATA: Cron job başarısız oldu! Detay: ${error.message}`
    });
  }
});

İşlem Durumunu Takip Etmek İçin "Heartbeat" Kullanımı

Görevlerinizin gerçekten çalışıp çalışmadığını anlamak için bir "Heartbeat" (kalp atışı) mekanizması kurun. Görev başarıyla tamamlandığında veritabanında veya bir Redis anahtarında last_run_at değerini güncelleyin. Eğer bu değer belirlenen süreden daha eskiyse, sistemin kilitlendiğini veya cron job'ın durduğunu anlayabilirsiniz.

Yöntem Avantajı Kullanım Alanı
Worker Threads Ana iş parçacığını serbest bırakır Resim işleme, veri analizi
Redis Kuyrukları Görevlerin sıraya alınmasını sağlar E-posta gönderimi, toplu işlemler
Heartbeat İzleme Sistemin sağlığını anlık gösterir Kritik finansal raporlamalar

Sonuç

Node.js ile cron job kullanmak, uygulamalarınızda tekrarlayan süreçleri otomatize etmenin en temiz yoludur. Bu rehberde, temel zamanlama yapısından hata yönetimine ve üretim ortamı güvenlik önlemlerine kadar kritik noktaları inceledik. Bir sonraki adım olarak, karmaşık görevleriniz için Redis tabanlı kuyruk yapılarını (BullMQ gibi) araştırmanızı öneririm.

Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Uygulamanızın canlı ortamda güvenliği, veritabanı yönetimi ve sunucu yapılandırması tamamen geliştiricinin sorumluluğundadır. Kritik verilerle çalışırken her zaman yedekleme ve güvenlik protokollerini uygulayın.
Bu yazıya tepkinizi paylaşın:
Zeynep Arslan

Mutfak pratikleri ve organizasyonel hayat tüyoları üzerine uzman bir içerik üreticisiyim. Günlük rutinleri optimize eden yöntemleri, anlaşılır ve uygulanabilir rehberler haline getiriyorum.

Yorumlar (0)

Yorum Yaz