Workflow Automation

Uzun Süreli İş Akışlarını Ustalıkla Yönetme: Temporal.io ile Java'ya Özel Desenler

Modern mikroservis mimarisi dünyasında, uzun süren iş süreçlerini yönetmek en kalıcı zorluklardan biridir. İster sipariş yerine getirme hattı, ister karmaşık bir onay iş akışı, ister IoT cihaz yönetimi olsun, geleneksel senkron istek-yanıt modelleri genellikle yetersiz kalır. Zaman aşımı sorunlarıyla, durum kalıcılığıyla ve geçici hatalara karşı dayanıklılıkla mücadele ederler.

İşte güvenilir, dağıtık uygulamalar için açık kaynaklı bir platform olan Temporal.io. Temporal birden fazla dili desteklerken, Java SDK'sı güçlü yazım denetimi, Spring Boot gibi tanıdık ekosistemlerle entegrasyon ve sağlam araç desteği gibi kurumsal geliştiriciler için benzersiz avantajlar sunar. Bu yazı, Temporal kullanarak dayanıklı ve uzun süren iş akışları oluşturmak için Java'ya özel desenleri incelemektedir.

Temel Soyutlama: Workflow ve Activity Arasındaki Fark

Koda dalmadan önce, Temporal'ın getirdiği zihinsel model değişimini anlamak çok önemlidir. Geleneksel hizmet odaklı mimarilerde, bir dizi hizmet çağrısı yazarsınız. Temporal'da ise bir Workflow (durum makinesi) ve Activities (yan etki yaratan işlevler) tanımlarsınız. Workflow mantığı deterministiktir ve tekrar oynatmaya güvenlidir; Activities ise veritabanı güncellemeleri veya API çağrıları gibi G/Ç işlemlerini yönetir.

Buradaki temel Java'ya özgü desen, mantığı ayırmaktır. Workflow yöntemleriniz hafif olmalı ve yalnızca kontrol akışı içermelidir. Tüm ağır işler Activities'a devredilmelidir.

Dayanıklı Bir Onay İş Akışının Uygulanması

Pratik bir örneğe bakalım: bir satın alma onay süreci. Bu iş akışı, sistemin duyarlı ve durum bilgili kalmasını sağlarken kullanıcı girdisini (onay/red) beklemeyi gerektirir.

İlk olarak, Activity arayüzünü tanımlayın. Bu, harici eylemi temsil eder.

public interface ProcurementActivities {
    @ActivityMethod
    void submitOrderForApproval(String orderId, double amount);
    
    @ActivityMethod
    void processApprovedOrder(String orderId);
    
    @ActivityMethod
    void rejectOrder(String orderId, String reason);
}

Şimdi, Workflow'u uygulayın. Java'da WorkflowInterface'i genişletir ve iç içe iş akışları için Workflow.newChildWorkflowOptions() veya sinyaller için Workflow.await() kullanırsınız. Bir sinyal, iş akışının duraklamasına ve harici girdiyi beklemesine olanak tanır.

@WorkflowInterface
public interface ProcurementWorkflow {
    @WorkflowMethod
    void processOrder(String orderId, double amount);

    @SignalMethod
    void approve(String orderId);

    @SignalMethod
    void reject(String orderId, String reason);
}

@WorkflowImplementation
public class ProcurementWorkflowImpl implements ProcurementWorkflow {

    private final ProcurementActivities activities = Workflow.newActivityStub(
        ProcurementActivities.class,
        Workflow.newActivityOptions(
            ActivityOptions.newBuilder()
                .setScheduleToCloseTimeout(Duration.ofSeconds(30))
                .build()
        )
    );

    private volatile boolean approved = false;
    private String rejectionReason = null;

    @Override
    public void processOrder(String orderId, double amount) {
        activities.submitOrderForApproval(orderId, amount);

        // Bir sinyal gelene kadar sonsuza kadar bekle
        Workflow.await(() -> approved || rejectionReason != null);

        if (approved) {
            activities.processApprovedOrder(orderId);
        } else {
            activities.rejectOrder(orderId, rejectionReason);
        }
    }

    @Override
    public void approve(String orderId) {
        this.approved = true;
    }

    @Override
    public void reject(String orderId, String reason) {
        this.rejectionReason = reason;
    }
}

Üretim İçin Önemli Java Desenleri

Bu desenleri Java'da uygularken şu üç en iyi uygulamayı göz önünde bulundurun:

  1. Determinizm Müzakere Konusu Değildir: Workflow yöntemi içinde asla System.currentTimeMillis() veya rastgele sayı üreticileri kullanmayın. Bunun yerine Workflow.currentTimeMillis() kullanın. Tutarlılığı sağlamak için iş akışı mantığı her çağrıldığında baştan tekrar oynatılır.
  2. İş Parçacığı Güvenliği: İş akışları tekrar oynatılabildiğinden, paylaşılan durum dikkatlice yönetilmelidir. Yukarıdaki örnekteki volatile anahtar kelimesi iş parçacıkları arasında görünürlüğü sağlar, ancak genel olarak Workflow durumunu değişmez veya sıkı kontrol altında tutulmuş olarak ele almalısınız.
  3. İstisna Yönetimi: Activities'ın hatalar için istisna atmasına izin verin. Workflow bu istisnaları yakalayıp yedekleme mantığı veya düşüş yolları uygulayabilir, böylece iş mantığınız temiz ve odaklı kalır.

Sonuç

Java geliştiricileri, Temporal.io ile uzun süren iş süreçleri oluşturmak için güçlü bir araç setine sahiptir. Durum yönetimini G/Ç'den ayırarak ve deterministik tekrar oynatmadan yararlanarak, yalnızca dayanıklı olmakla kalmayan, aynı zamanda gözlemlenebilir ve hata ayıklanabilir sistemler oluşturabilirsiniz. İş süreçleriniz karmaşıklaştıkça, Temporal'ın Java SDK'sı güvenilirlikten ödün vermeden ölçeklendirme için gereken yapısal bütünlüğü sağlar. Küçük başlayın, açık Activities tanımlayın ve orkestrasyonu çerçeveye bırakın.

Share: