İnsan göğsünün derinliklerinde, sağ kulakçığın üst duvarında sadece birkaç milimetrelik mikroskobik bir hücre kümesi bulunur: Sinoatriyal (SA) Düğüm.
Burası insan bedeninin baş zamanlayıcısıdır (Master Clock). Herhangi bir dış müdahaleye, beyinden gelecek bir komuta bile ihtiyaç duymadan; kendi kendine elektriksel aksiyon potansiyeli üretir. Dakikada 70 kez o minik elektriksel kıvılcımı çakar, sinyal kulakçıklardan karıncıklara yayılır ve kalp kasılır: Küt... Küt... Küt...
Bütün biyolojik varoluşumuz, bu hücre kümesinin milisaniyelik bir intizamla zamanı saymasına bağlıdır.
Ancak yaşlılık, enfarktüs veya iletim bozuklukları nedeniyle o doğal zamanlayıcı iflas ettiğinde (örneğin tam kalp bloğu veya ağır bradikardi geliştiğinde); kalp kendi ritmini kaybeder. Nabız 20'ye düşer, beyne kan gitmez ve insan yere yığılır.
O an tıbbın devreye soktuğu dahi mühendislik harikası nedir biliyor musunuz? Yapay Kalp Pili (Pacemaker).
Cerrah köprücük kemiğinin altına küçük, titanyum kaplı bir pil yerleştirir; ucundaki elektrotları kalbin odacıklarına uzatır. Pacemaker sessizce orada bekler. Kalbin kendi ritmini dinler. Eğer kalp vaktinde atmazsa, pacemaker saniyenin binde biri kadar bir hassasiyetle küçük bir elektrik uyarısı gönderir ve kalbe vuruş yaptırır.
Kullanıcı onu görmez. Aynaya baktığında fark etmez. Ön yüzde hiçbir şovu yoktur. Ama o pil durduğu an, hayat biter.
Peki yazılım dünyasında sistemlerimizin ritmini veren, gece gündüz sessizce çalışan o gizli kalp pilleri nelerdir? Cron Job'lar ve Zamanlanmış Görevler (Schedulers).
Ön Yüzün Şovuna Kananlar, Arka Planın Ritmini Görmez
Yazılım geliştiriciler ve ürün yöneticileri, genellikle kullanıcıların doğrudan gördüğü "ön yüz" (frontend) özelliklerine aşık olurlar: Parlak butonlar, akıcı mikro-animasyonlar, yapay zekalı sohbet pencereleri... Şirket içi kutlamalar hep bu ekranlar için yapılır.
Oysa bir teknoloji şirketini gerçekten hayatta tutan şey o pikseller değildir.
Bir şirketi hayatta tutan şey; sunucuların en karanlık köşesinde, kimsenin görmediği bir Linux kabuğunda veya Kubernetes CronJob manifestosunda tıkır tıkır çalışan o sessiz ritimlerdir:
- Her gece saat 00:01'de çalışan ve 50 bin abonenin kredi kartından yenileme ücretini tahsil eden faturalandırma cron'u,
- Her sabah saat 03:00'te veritabanının soğuk yedeğini alıp şifreleyerek farklı bir kıtadaki S3 bucket'ına yükleyen yedekleme script'i,
- Her 5 dakikada bir kuyrukta bekleyen e-postaları ve SMS bildirimlerini dağıtan worker servisi,
- Her saat başı süresi dolmuş oturumları ve geçici token'ları temizleyen boşaltım görevi...
Bu görevler tıpkı o kalp pili gibidir. Arka planda sessizce tıkır tıkır elektrik sinyali gönderirler.
Kalp Pili Durduğunda Ne Olur?
Bir cron job çöktüğünde ne olur biliyor musunuz?
Korkunç olan şudur: Sistem anında hata vermez.
Kullanıcılar siteye girmeye, sayfaları gezmeye ve sepete ürün eklemeye devam eder. Frontend'de tek bir kırmızı uyarı bile çıkmaz. Datadog dashboard'unuz yeşildir.
Ama arka planda kalp pili durmuştur. Aritmi başlamıştır:
- Faturalandırma cron'u çalışmadığı için şirketin kasasına para girmez,
- Yedekleme script'i sessizce patladığı için şirket günlerdir tek bir yedek bile almadan uçurumun kenarında yürümektedir,
- Geçici dosyaları temizleyen cron durduğu için disk alanı megabayt megabayt dolmaktadır.
Ve iki hafta sonra, o kaçınılmaz gün gelir: Disk %100 dolar, veritabanı kilitlenir, şirket tek bir günde binlerce abonesini kaybeder ve yedekten geri dönmek istediklerinde ellerinde hiçbir yedeğin olmadığını dehşet içinde fark ederler.
Bu ani bir ölüm değildir; bu, kalp pili durduğu için organları yavaş yavaş oksijensiz kalarak can veren bir sistemin dramıdır.
Güvenilir Bir Pacemaker Mimarisi
Birçok ekip cron job'ları o kadar amatörce yönetir ki hayret edersiniz: Sunucudaki rastgele bir kullanıcının crontab -e dosyasına yazılmış, logları /dev/nulla yönlendirilmiş, hata verdiğinde kimsenin ruhunun duymadığı yüzlerce sahipsiz komut!
Bu, bir hastaya kalp pili takıp, pilin çalışıp çalışmadığını asla kontrol etmemekle aynı cinayettir.
Eğer sisteminizin kalbini seviyorsanız, şu üç prensibi uygulamak zorundasınız:
- Ölü Adam Anahtarı (Dead Man's Snitch): Bir cron job hata verdiğinde alarm çalması yetmez; çalışmadığında da alarm çalmalıdır. Kalp pili gibi; eğer beklenen saatte o görevden bir "Ben hayattayım ve görevimi tamamladım" sinyali (heartbeat) gelmediyse, nöbetçi mühendisin telefonu anında çalmalıdır.
- Tekrar Çalışabilirlik (Idempotency): Bir zamanlayıcı şebeke kesintisi veya sunucu yeniden başlaması yüzünden aynı görevi iki kez çalıştırabilir. Kodunuz öyle tasarlanmalıdır ki; aynı cron job günde 10 kez de çalışsa, bir müşteriden asla iki kez para çekmemelidir.
- Çakışma Kilitleri (Overlap Locks / Mutex): Beş dakikada bir çalışan bir veri senkronizasyon cron'u, veri hacmi arttığı için 7 dakika sürebilir. Eğer arkadan gelen yeni cron işiyle çakışırsa, veritabanında deadlock patlar. Dağıtık bir kilit (örneğin Redis Redlock) kullanarak aynı görevin üst üste binmesini engellemelisiniz.
Göz önünde olanı parlatmak kolaydır.
Gerçek mühendislik ustalığı ise; kimsenin görmediği, kimsenin alkışlamadığı ama durduğu an tüm organizmayı öldürecek olan o arka plan ritimlerine bir cerrahın titizliğiyle bekçilik edebilmektir.
Sisteminizin kalbini sahipsiz bırakmayın.
O gizli zamanlayıcıların nabzını her saniye hissedin.