⚡ Blog AI Cron - Performans Optimizasyonu

📅 Tarih: 2025-11-17 02:05 | 🎯 Odak: Sistem performansı ve kaynak optimizasyonu | 💡 Çözüm: Hourly-based + Pre-calculated schedule

🔴 Sorun: everyMinute() Neden Kötü Fikir?

⚠️ Performans Sorunları

  • CPU Yükü: Dakikada 1 cron = Saatte 60 cron = Günde 1,440 cron çalışması
  • Database Query: Her çalışmada tenant loop + settings query → Gereksiz yük
  • Memory: Her tenant için context switch → Memory churn
  • Disk I/O: Log dosyası dakikada büyür → Disk dolar
  • Gereksiz İş: 100 tenant varsa, dakikada 100 tenant kontrol → Çoğu "skip"

📊 Performans Karşılaştırması

Metrik everyMinute() ❌ hourly() ✅ İyileştirme
Günlük Cron Sayısı 1,440 24 60x daha az
Aylık Cron Sayısı 43,200 720 60x daha az
Tenant Loop (100 tenant) 144,000/gün 2,400/gün 60x daha az
Settings Query Her dakika Cache (1 saat) 60x daha az
CPU Kullanımı Sürekli Saat başı spike %95 boşta
Log Boyutu (aylık) ~500MB ~8MB 60x daha küçük
1440
Günlük Cron (Minute)
24
Günlük Cron (Hourly)
60x
Performans İyileştirmesi
%95
CPU Tasarrufu

✅ Çözüm: Hourly-Based + Pre-Calculated Schedule

🎯 Yeni Mimari Prensipleri

  • Saatlik Base: ->hourly() kullan (her saat başı, günde 24 kez)
  • 1-24 Arası Selectbox: Günde kaç blog? (admin kolay seçsin)
  • Pre-Calculated Schedule: Tenant hangi saatlerde çalışacak? (settings kaydedildiğinde hesapla)
  • Cache: Schedule'ı cache'le (1 saat TTL), gereksiz query yok
  • Minimal Loop: Sadece o saatte çalışması gereken tenant'ları işle

📋 Settings Değişikliği

blog_ai_daily_count - Günlük Blog Sayısı

Eski Tasarım: Number (1-100 arası) → Karmaşık, her değer ayrı hesaplama

Yeni Tasarım: Select (1-24 arası) → Basit, performanslı, yeterli

Tip: select
Seçenekler:
1 - Günde 1 blog (00:00'da)
2 - Günde 2 blog (00:00, 12:00)
3 - Günde 3 blog (00:00, 08:00, 16:00)
4 - Günde 4 blog (Her 6 saatte)
6 - Günde 6 blog (Her 4 saatte)
8 - Günde 8 blog (Her 3 saatte)
12 - Günde 12 blog (Her 2 saatte)
24 - Günde 24 blog (Her saat başı)

Varsayılan: 24 (saatte 1 blog)

Neden 1-24?

  • 24 blog/gün = 720 blog/ay → Çok fazla içerik!
  • 100 blog/gün gereksiz (SEO spamming, quality düşer)
  • Saatlik divisor'lar kolay hesaplama: 24/1, 24/2, 24/3, 24/4, 24/6, 24/8, 24/12, 24/24
  • Admin panel basit selectbox → Kullanıcı dostu

🧮 Saat Hesaplama Algoritması

Hangi Saatlerde Çalışacak?

active_hours = [0, 24/daily_count, 24/daily_count*2, ..., 24-24/daily_count]

Örnek: daily_count = 6 → 24/6 = 4 → [0, 4, 8, 12, 16, 20]

📊 Saat Dağılım Örnekleri

Örnek 1: Günde 1 Blog

daily_count = 1

00
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23

Aktif Saatler: [0] → Sadece gece yarısı çalışır

Örnek 2: Günde 6 Blog

daily_count = 6

00
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23

Aktif Saatler: [0, 4, 8, 12, 16, 20] → Her 4 saatte 1

Örnek 3: Günde 24 Blog (Maksimum)

daily_count = 24

00
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23

Aktif Saatler: [0-23 hepsi] → Her saat başı

🏗️ Sistem Mimarisi

1️⃣ Settings Kaydedildiğinde

Pre-Calculate & Cache

Tetikleyici: Admin blog AI settings'i kaydettiğinde

Algoritma:
1. daily_count değerini al (1-24)
2. Aktif saatleri hesapla:
interval = 24 / daily_count
hours = [0, interval, interval*2, ..., 24-interval]
3. Cache'e kaydet:
Cache::put("blog_cron_schedule_tenant_{id}", hours, 86400)

Örnek:
daily_count = 6
interval = 24/6 = 4
hours = [0, 4, 8, 12, 16, 20]
Cache: {"tenant_2": [0,4,8,12,16,20]}

✅ Avantaj: Her cron'da hesaplama yok, direkt cache'den oku!

2️⃣ Cron Her Saat Başı Çalıştığında

Minimal Tenant Loop

Algoritma:
1. Şimdiki saat = date('H') → Örnek: 04
2. Tenant listesini cache'den al (tüm tenant ID'leri)
3. Her tenant için:
a. blog_ai_enabled kontrol et (cache'den)
b. Schedule'ı cache'den al (pre-calculated hours)
c. Şimdiki saat schedule'da var mı?
d. Varsa → Blog üret
e. Yoksa → Skip (bu tenant'ı atlama)

Örnek (Saat 04:00):
• Tenant A: schedule=[0,4,8,12,16,20] → 4 VAR → Blog üret ✅
• Tenant B: schedule=[0] → 4 YOK → Skip ⏭️
• Tenant C: schedule=[0-23] → 4 VAR → Blog üret ✅
• Tenant D: enabled=false → Skip ⏭️

✅ Avantaj: Gereksiz işlem yok, sadece ilgili tenant'lar işlenir!

3️⃣ Cache Stratejisi

Çok Katmanlı Cache

  • Tenant List Cache:
    Key: blog_cron_tenant_list
    Value: [1, 2, 3, 4, 1001, ...]
    TTL: 1 saat
    → Her cron'da tenant query yok
  • Tenant Schedule Cache:
    Key: blog_cron_schedule_tenant_{id}
    Value: [0, 4, 8, 12, 16, 20]
    TTL: 24 saat
    → Settings kaydedildiğinde invalidate + yeniden hesapla
  • Tenant Settings Cache:
    Key: blog_ai_settings_tenant_{id}
    Value: {enabled: true, daily_count: 6, auto_publish: true}
    TTL: 1 saat
    → Her cron'da settings query yok

⚡ Performans: 3 cache hit → 0 database query!

📊 Performans Metrikleri

🎯 Beklenen İyileştirmeler

Metrik Değer Açıklama
Cron Frekansı Saatte 1 24/gün, 720/ay → Optimal
Database Query (Cron) ~0 Tüm data cache'den
Tenant Loop Minimal Sadece enabled tenant'lar
CPU Kullanımı Saat başı spike %95+ zaman boşta
Memory Footprint Düşük Cache hit, DB connection yok
Log Boyutu (Aylık) ~8MB Günde 24 log entry × 30 gün
Ölçeklenebilirlik 1000+ tenant Cache-first, linear scaling

✅ Sistem Kapasitesi

100 Tenant Senaryosu:
• Her cron'da 100 tenant kontrol
• Ortalama 20 tenant aktif (blog_ai_enabled=true)
• Her saatte ortalama 5-10 blog üretimi
• Günde 120-240 blog üretimi (tüm sistem)
• Database query: ~0 (cache hit)
• İşlem süresi: <1 saniye

1000 Tenant Senaryosu:
• Cache-first stratejisi ile linear scaling
• İşlem süresi: <5 saniye
• Günde 1000-2000+ blog üretimi (tüm sistem)
• CPU/Memory kullanımı: Minimal

🎯 Final Karar

✅ Önerilen Mimari

  • Schedule: ->hourly() (her saat başı, günde 24 kez)
  • Settings: blog_ai_daily_count → Select (1-24 arası)
  • Pre-Calculate: Settings kaydedildiğinde aktif saatleri hesapla
  • Cache: Tenant list + Schedule + Settings (multi-layer)
  • Minimal Loop: Sadece ilgili tenant'ları işle
  • Auto-Publish: blog_ai_auto_publish ayarına göre published/draft
60x
Daha Az Cron
~0
DB Query/Cron
24
Max Blog/Gün/Tenant
1000+
Tenant Kapasitesi

🎉 Sonuç

Performanslı, ölçeklenebilir, kullanıcı dostu bir sistem!

• Admin basit selectbox'tan 1-24 arası seçer
• Sistem otomatik saatleri hesaplar ve cache'ler
• Her saat başı sadece o saatte çalışması gereken tenant'lar işlenir
• Gereksiz database query, CPU, memory kullanımı yok
• 24 blog/gün = 720 blog/ay → Bol içerik!
• 1000+ tenant'a kadar sorunsuz çalışır