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 (17)

17
okuyucu bu yazı hakkında yorum yaptı. Siz de deneyiminizi paylaşarak diğer okuyuculara yardımcı olabilirsiniz.
Caner Yılmaz
Caner Yılmaz 02 Ağustos 2026

Eline sağlık Zeynep, çok temiz anlatım olmuş. Node-cron kullanıyordum ama hata yönetimi kısmını atlamışım, o bölüm iyi oldu.

Zeynep Arslan
Zeynep Arslan 03 Ağustos 2026

Teşekkür ederim Caner, hata yönetimi özellikle üretim ortamında hayat kurtarıyor.

Burak Şen
Burak Şen 03 Ağustos 2026

Ya arkadaslar bende calıstıramadım bi turlu, npm install yaptım ama hata veriyo sureklı. bi el atsanız?

Selin Kaya
Selin Kaya 04 Ağustos 2026

Kanka node sürümünü kontrol ettin mi? Bazen eski sürümlerde problem çıkabiliyor.

Deniz Yıldız
Deniz Yıldız 04 Ağustos 2026

Çok açıklayıcı bir yazı olmuş. Peki bunu Docker container içinde çalıştırırken dikkat etmemiz gereken ekstra bir şey var mı?

Zeynep Arslan
Zeynep Arslan 05 Ağustos 2026

Docker tarafında zaman dilimi (timezone) ayarlarına dikkat etmenizi öneririm, bazen sunucu saati ile çakışabiliyor.

Ahmet Demir
Ahmet Demir 05 Ağustos 2026

Node-cron yerine bullmq mi kullansak acaba? Büyük projelerde node-cron biraz zayıf kalabiliyor sanki.

Zeynep Arslan
Zeynep Arslan 06 Ağustos 2026

Doğru bir noktaya değindin Ahmet. Eğer iş kuyruğu ve daha karmaşık bir yapı gerekiyorsa BullMQ kesinlikle daha profesyonel bir seçim.

Merve Çelik
Merve Çelik 05 Ağustos 2026

Harika özetlemişsin, tam da bugün arıyordum bunu. Hemen projeye entegre edicem.

Fatih Er
Fatih Er 05 Ağustos 2026

yazı güzel ama keşke daha fazla örnek kod koysaydın. yine de iş görür.

Ayşe Yılmaz
Ayşe Yılmaz 06 Ağustos 2026

Emeğine sağlık, çok temiz bir dille anlatmışsın. Takipteyim.

Berkcan T.
Berkcan T. 06 Ağustos 2026

beyler ben bunu windows sunucuda çalıştırıyorum sorun olur mu? genelde linux öneriyolar da?

Emre Güneş
Emre Güneş 06 Ağustos 2026

Sorun olmaz kanka ama üretim ortamında linux her zaman daha stabil çalışır, benden söylemesi.

Zehra Nur
Zehra Nur 06 Ağustos 2026

Çok faydalı olmuş, teşekkürler Zeynep Hanım. Özellikle cron ifadesinin nasıl yazılacağı kısmı kafa karıştırıcıydı, sayenizde anladım.

Zeynep Arslan
Zeynep Arslan 06 Ağustos 2026

Rica ederim Zehra Hanım, cron tablosu biraz karışık gelebiliyor ama zamanla alışılıyor.

Oğuzhan Kar
Oğuzhan Kar 07 Ağustos 2026

Süper yazı! Tam ihtiyacım olan şeydi. PM2 ile birlikte kullanınca çok daha güzel oluyor.

Zeynep Arslan
Zeynep Arslan 07 Ağustos 2026

Kesinlikle katılıyorum, PM2 ile süreç yönetimi yapmak en sağlıklısı.

Yorum Yaz