Dağıtık sistemlerin modern manzarasında, güvenilir mikroservisler oluşturmak sadece yarısıdır. Diğer yarısı veya çoğu zaman en zor yarısı, ağ bölündüğünde veya sunucular çöktüğünde durumu kaybetmeden bu servisler arasındaki karmaşık etkileşimleri koordine etmektir. Temporal burada devreye girer.
Temporal, dağıtık iş akışlarını koda getiren bir platformdur. Altyapı arızalarında uzun süren iş süreçlerinin hayatta kalmasını sağlayarak geçici hataların, veri tutarlılığının ve ölçeklenebilirliğin sorunlarını çözer. Kırılgan yeniden deneme mantığı yazmak veya veritabanları ve kuyruklar kullanarak özel durum makinaları uygulamak yerine, geliştiriciler Temporal'ın kalıcı olarak çalıştırdığı doğrusal kodlar yazabilir.
Geleneksel Orkestrasyonun Sorunları
Geleneksel olarak, bir siparişi işlemeniz, kredi kartı ödemesi almanız, envanteri güncellemeniz ve bir onay e-postası göndermeniz gerekiyorsa, bu API'leri sırayla çağıran bir fonksiyon yazardınız. Ödeme ağ geçecisi zaman aşımına uğrarsa, sisteminiz sonsuza kadar askıda kalabilir veya tutarsız bir duruma girebilir. Bunu düzeltmek için mühendisler genellikle Kafka veya RabbitMQ gibi mesaj aracıları kullanarak karmaşık yeniden deneme mekanizmaları, devre kesiciler ve saga desenleri oluşturur.
Bu yaklaşım, iş mantığının altyapı kaygıları ile iç içe geçtiği "spagetti kod" durumuna yol açar. Test etmesi zordur, hata ayıklaması zordur ve ölçeklendirmesi zorlaşır.
Temporal, iş mantığınız için bir "sanal makine" sağlayarak bu paradigmayı değiştirir. Kod yürütmenizi otomatik olarak kontrol noktalarına (checkpoint) kaydeder. Çalışan düğümünüz (worker node) yürütme sırasında ölürse, Temporal çalışanı yeniden başlatır ve tüm iç değişkenleri ve durumu koruyarak iş akışını kaldığı yerden devam ettirir.
Temel Kavramlar: İş Akışı vs. Etkinlik
Temporal'dan etkili bir şekilde yararlanmak için iki temel soyutlamasını anlamanız gerekir:
1. **İş Akışları (Workflows):** Bunlar kalıcı, uzun süren fonksiyonlardır. Deterministik olmalıdır. Bu, doğrudan rastgele sayı üretimi, mevcut zaman damgaları veya ağ çağrıları içeremedikleri anlamına gelir. İşlemlerin mantığını ve sırasını tanımlarlar.
2. **Etkinlikler (Activities):** Bunlar asıl işi yapan, kısa süren ve deterministik olmayan fonksiyonlardır; örneğin harici bir API'yi çağırma, bir veritabanını sorgulama veya veri işleme. Etkinlikler, kalıcı iş akışı kodunuz ile dış dünya arasındaki köprüdür.
Bu kaygıları ayırarak Temporal, iş mantığınızın temiz ve test edilebilir kalmasını sağlar; yürütme, yeniden deneme ve durum yönetiminin karmaşıklığını ise kendi üstlenir.
Pratik Uygulama
Temporal'ın temel dillerinden biri olan Go'da pratik bir örneğe bakalım. Bir siparişi işleyecek, bir ödeme servisiyle etkileşime geçecek ve hataları zarifçe yönetecek bir iş akışı tanımlayacağız.
```go
func ProcessOrderWorkflow(ctx workflow.Context, order OrderID) error {
// Etkinlikler için yeniden deneme politikası tanımla
ao := workflow.ActivityOptions{
StartToCloseTimeout: 10 * time.Second,
RetryPolicy: &temporal.RetryPolicy{
MaximumAttempts: 5,
},
}
ctx = workflow.WithActivityOptions(ctx, ao)
// İlk etkinliği yürüt
var paymentStatus string
err := workflow.ExecuteActivity(ctx, ProcessPaymentActivity, order).Get(ctx, &paymentStatus)
if err != nil {
// İş akışı hatayı işleyebilir veya yukarı fırlatabilir
return err
}
// Etkinlik sonucuna dayalı koşullu mantık
if paymentStatus == "FAILED" {
return errors.New("Payment processing failed")
}
// Sonraki etkinliği yürüt
err = workflow.ExecuteActivity(ctx, SendConfirmationEmailActivity, order.CustomerEmail).Get(ctx, nil)
if err != nil {
// Hata günlüğe kaydet ama envanter güncellemesini işlemeye devam et
workflow.GetLogger(ctx).Error("Email failed", "error", err)
}
// Envanteri güncelle
return workflow.ExecuteActivity(ctx, UpdateInventoryActivity, order).Get(ctx, nil)
}
```
Bu örnekte, `ProcessPaymentActivity` başarısız olursa Temporal, yeniden deneme politikasına göre bunu otomatik olarak yeniden dener. Başarısızlık devam ederse, iş akışı nasıl ilerleyeceğini belirleyebilir. İş akışı kodunun kendisinin, tekrarlayan yeniden deneme mantığından arındırılmış basit ve okunabilir olduğunu unutmayın.
Kurumsal Geliştirme İçin Faydalar
Kodu basitleştirmenin ötesinde, Temporal önemli operasyonel faydalar sunar. Arayüzü aracılığıyla yerleşik gözlemlenebilirlik sağlar; bu da her iş akışı örneğinin yürütülmesini izlemenize olanak tanır. Bir iş akışının tam olarak nerede takıldığını, etkinlikler arasında hangi verilerin aktarıldığını ve bir etkinliğin neden başarısız olduğunu görebilirsiniz. Bu, üretim sorunları için Ortalama Çözüm Süresini (MTTR) önemli ölçüde azaltır.
Ayrıca Temporal, alt iş akışları, sinyaller ve sorgular gibi gelişmiş desenleri destekler. Sinyaller, çalışan bir iş akışına güncellemeler göndermenizi sağlar; sorgular ise yürütmeyi durdurmadan mevcut durumunu incelemenize olanak tanır. Bu, Temporal'ı basit toplu işlerden karmaşık, çok adımlı kullanıcı kayıt akışlarına kadar her şey için uygun kılar.
Sonuç
Temporal, dağıtık sistemlere yaklaşım şeklimizde bir paradigm shift (değişim) temsil eder. İş akışlarını kodda birinci sınıf vatandaşlar olarak ele alarak geliştiricilerin, dağıtık konsensüs ve hata yönetiminin inceliklerine takılmadan dayanıklı, ölçeklenebilir uygulamalar oluşturmasına olanak tanır. Mimarilerini modernleştirmek ve mikroservisleri yönetmenin bilişsel yükünü azaltmak isteyen ekipler için Temporal paha biçilmez bir araçtır. Go, Python, Java veya TypeScript kullanıyor olun, Temporal'ı benimsemek operasyonel güvenilirliğinizi ve geliştirici hızınızı dönüştürebilir.