Temporal veya Netflix Conductor kullanarak merkezi bir Saga Orkestratörü uygulayın; bu, PostgreSQL'de kalıcı iş akışı durumunu koruyarak alan hizmetlerine gRPC iletişimi sağlar. Bu model, ticari kısıtlamalara uyan TTL pencereleri ile Redis Cluster'da saklanan idempotans anahtarlarını gerektirir; Apache Kafka, denetim izleri ve tazminat tetikleyicileri için olay omurgası olarak hizmet eder. Her saga adımı, Saga Durum Makinesi modeli kullanarak ters işlemleri gerçekleştiren telafi işlemlerini içermelidir; açık durumlar (BEKLEME, BAŞARILI, TELAFİ, TELAFİ EDİLDİ) için etcd veya ZooKeeper'da kümeye koordinasyon sağlamak üzere izlenmelidir.
┌─────────────────┐ ┌──────────────┐ ┌─────────────────┐
│ API Gateway │────▶│ Temporal │────▶│ Inventory │
└─────────────────┘ │ Orkestratör │ │ Hizmeti │
└──────────────┘ └─────────────────┘
│ │
▼ ▼
┌──────────────┐ ┌─────────────────┐
│ PostgreSQL │ │ PostgreSQL │
│ Durum Deposu│ │ (Telafi │
└──────────────┘ │ Mantığı) │
└─────────────────┘
Küresel bir otel rezervasyon platformu, üç ayrı Kubernetes kümesinde oda rezervasyonları, ödeme işlemleri ve sadakat puanı güncellemelerini koordine ederken zincirleme hatalarla mücadele etti. Mevcut uygulamaları, REST API’leri üzerinden İki Aşamalı Taahhüt (2PC) kullanıyor ve ödeme geçidi 10 saniyeyi geçen gecikme zirveleri yaşadığında geniş kapsamlı deadlock'lara neden oluyordu.
Takım, her hizmetin alan olaylarını ortak bir otobüse yayınladığı Koordinasyon Tabanlı Saga'yı Amazon EventBridge kullanarak değerlendirdi. Bu yaklaşım, tek bir hata noktasını ortadan kaldırarak altyapı maliyetlerini %40 oranında azalttı. Ancak, karmaşık çok odalı bir rezervasyonun başarılı olup olmadığını belirlemek için on yedi mikro hizmet arasında günlükleri sorgulamayı gerektiren ciddi gözlem zorlukları tanıttı. Dolaylı bağımlılıklar, tutarlı zaman aşımı politikalarını uygulamayı imkansız hale getirdi ve üretim sorunlarının giderilmesi, birden fazla AWS CloudWatch panelini kapsayan adli bir inceleme haline geldi.
Bir özelleştirilmiş Node.js koordinatörü ile AWS ECS'ye dağıtılan bir Orkestrasyonlu Saga prototipi oluşturdular. Bu, iş mantığını merkezi hale getirerek tek bir Grafana panosu üzerinden izlemenin basitleşmesini sağladı. Ne yazık ki, ilk uygulama iş akışı durumunu yalnızca bellekte saklıyordu; bu, dağıtımlar sırasında koordinator yeniden başlatıldığında felakete neden oldu. Otuz işlem bilinmeyen durumlara girdi ve manuel veritabanı uzlaşması gerektiriyordu; bu süreç üç gün sürdü ve çift ücretlendirilen müşterilerden dolayı önemli gelir kaybına neden oldu.
Seçilen çözüm, pod yeniden başlatmaları ve AZ arızaları boyunca durum kalıcılığı sağlamak için Cassandra kalıcılığı ile Temporal'ı iş akışı motoru olarak hazırladı. Mimari, orkestratör ile alan hizmetleri arasında tür güvenli iletişim için Protobuf şemaları kullandı; Redis Sentinel ise idempotans anahtarlarını yönetiyordu. Ödeme hizmeti, us-east-1 bölgesinde bir kesinti yaşadığında, saga otomatik olarak oda rezervasyonlarını 200ms içinde serbest bırakan ve sadakat puanlarını atomik olarak geri alan tazminat iş akışlarını tetikledi.
Sistem şimdi günlük 50.000 karmaşık rezervasyon işliyor; %99.99 tutarlılık garantisi ile, ağ bölünmeleri sırasında sıfır manuel müdahale ile çalışıyor. Hataları tespit etme süre ortalaması (MTTD) 45 dakikadan 8 saniyeye düştü; tazminat gecikmesi p99'da 500ms'nin altında kaldı.
Bir telafi işleminin kendisi başarısız olduğunda, sistemin tutarsız bir durumda kalmasına neden olabilecek kısmi telafi başarısızlığını nasıl ele alırsınız?
Her denenen telafinin Apache Kafka'da sonsuz saklama ile değişmez bir olay olarak kaydedildiği bir Telafi Denetim Günlüğü uygulayın. Sistem, otomatik yeniden deneme gerektiren geçici altyapı arızalarını ve insan müdahalesi gerektiren iş mantığı ihlallerini ayırt etmelidir. Geçici sorunlar için, RabbitMQ veya Amazon SQS'de telafileri hizmet geri kazanımından sonra jitter ile yeniden işleyen Ölü Mektup Kuyrukları (DLQ) kullanın. Bir iş kuralı ihlali, örneğin daha önce yerleşik bir işlemi iade etmeye çalışmak, saga’nın 'TELAFİ_BAŞARISIZ' durumuna girmesine neden olur; bu da PagerDuty uyarılarını tetiklerken, toplam nesneyi komut modeli aracılığıyla dondurmak için CQRS modelini uygular. Her zaman telafileri, veri tabanı benzersiz kısıtlamaları veya Redis SETNX işlemleri kullanarak idempotent olacak şekilde tasarlayın; bu, yeniden denemelerin yan etki yaratmasını sağlar.
Zamansal bağlanabilirlik ve 'mevcut işlem durumu nedir' sorgularını yanıtlama yeteneği açısından, koreografi ile orkestrasyon arasındaki temel mimari fark nedir?
Koreografi, Reaktif Manifesto'yu izleyerek, hizmetlerin yukarı veya aşağı akış katılımcıları hakkında bilgiye sahip olmadan olaylara tepki vermesini sağlayan zamansal ayrılma yaratır, ancak karmaşık Dağıtık İzleme yapmadan saga durumunu sorgulama yeteneğinden feragat eder. Durum, etkinlik günlüklerinden beliren bir durum haline gelir; bu, 'rezervasyon tamamlandı mı' sorularını yanıtlamak için CQRS okuma modelleri projeksiyonları gerektirir. Orkestrasyon, koordine edici ile çalışanlar arasında açık bir zamansal bağıntı getirir; zira orkestratör, bir sonraki adımı tetiklemek için mevcut olmalıdır, ancak durum deposunda ( PostgreSQL/CockroachDB) tek bir gerçek kaynağı sunar. Bu, anında durum sorgularına olanak tanır, ancak bir ağ bağımlılığı yaratır. Kritik içgörü, koreografinin her tüketicide durum makineleri uygulamayı gerektirmesi, orkestrasyonun bu karmaşıklığı merkezi hale getirmesidir; güçlü denetlenebilirlik ve uyumluluk (PCI-DSS) gerektiren sistemler için, bağlılık maliyetine rağmen orkestrasyon tercih edilir.
Kafka tüketici yeniden dengelemesi veya Kubernetes pod yeniden başlatmaları sırasında mesaj aracıların en az bir kez teslimat anlayışını kullanırken tekrarlanan saga yürütimini nasıl engellersiniz?
Redis veya Memcached kullanarak işlenmiş mesaj kimliklerini, geri kazanım noktası hedefinizin (RPO) genellikle finansal sistemler için 24-48 saat olan çifte yedekleme pencereleri ile saklayarak İdempotent Tüketici modellerini uygula ın. Bir saga orkestratörü bir komut aldığında, her türlü yan etkinliği gerçekleştirmeden önce bir iş anahtarı (müşteri kimliği + rezervasyon referansı) ile ilişkili kimlik bilgisini hashleyerek deterministik bir idempotans anahtarı oluşturun. Her alan hizmeti, bu anahtarı kendi İdempotans Deposu ile doğrulamalıdır; bu, bileşik anahtarlar üzerinde benzersiz kısıtlamalar bulunan bir PostgreSQL tablosu veya bellek verimli negatif aramalar için Redis'de Bloom Filtreleri olarak uygulanır. Uzun süreli sagalar için, dağıtılmış düğümler arasında tam bir kez işleme anlamlarını ele almak üzere etcd sürüm vektörleri aracılığıyla iyimser kilitli Saga Durum Makineleri kullanın. Bu, tüketici grupları, dağıtımlar sırasında veya Kubernetes livenessProbe yeniden başlatmalarını tetikleyen ağ bölünmeleri sırasında çift rezervasyon senaryolarını önler.