Sorunun cevabı.
Mimari, geçici hesaplamaları kalıcı durumdan ayıran Dayanıklı İcra modeline odaklanmaktadır ve bir olay kaynaklı kontrol düzlemi aracılığıyla yürütülür. Temel olarak iş akışı tanımları, her durum geçişinin Apache Kafka'da (ön yazma kaydı) kalıcı hale getirildiği deterministik durum makineleri olarak yürütülmektedir, bu sayede hatalar sırasında deterministik yeniden oynatma olanağı sunulmaktadır. Hesaplama katmanı, her kiracı için VPC'ler ve IAM sınırları içinde düzenlenmiş AWS Lambda veya Azure Functions kullanarak izole olmalarını sağlarken, soğuk başlatmaları azaltmak için sağlanan eşzamanlılık sıcak havuzlarından faydalanır. Bölgeler arası tam bir kez gerçekleştirme için sistem, workflow durumunu depolamak üzere varsayılan olarak serileştirilmiş izolasyon ile CockroachDB'yi kullanırken, bu, ayrı bir koordinatör hizmetine ihtiyaç duymadan bölge çapında tutarlılığı sağlamak için Raft mutabakatını kullanır. Olay ilişkisi, Redis kümeleri ve RedisJSON indeksleme aracılığıyla bellek içinde sıcak olay eşleştirme gerçekleştirerek alt saniye gecikmesine ulaşmaktadır; Elasticsearch ise tarihi ilişkilendirme sorguları için soğuk depolama olarak hizmet etmektedir, Cloudflare Workers ise trafik dalgalanmalarını absorbe etmek için kenar tarafında olay tamponlaması sağlamaktadır.
Gerçek Hayattan Bir Durum
Black Friday 2023 sırasında, SwiftCart (küresel bir e-ticaret platformu) 3-7 gün süren 50M eş zamanlı teslimat iş akışlarını işlerken eski Step Functions uygulamalarında felaket başarısızlıklarıyla karşı karşıya kaldı. us-east-1 bölgesi bir kesintiye uğradığında, us-west-2'ye geçiş 12.000 çoğaltılmış gönderimle sonuçlandı çünkü iş akışı durumu uzlaşması DynamoDB sonradan tutarlılığına bağımlıydı ve 5 dakikalık TTL pencereleri ile yürütülüyordu. Aynı zamanda, taşıyıcı webhook olayları 30 saniyelik ilişkilendirme gecikmeleri yaşadı, bu da müşterilere gerçek zamanlı takip vaadleriyle çelişiyor ve 2M $ SLA cezasına yol açıyordu.
Çözüm A: EKS'deki Airflow ile Kubernetes tabanlı orkestratör
Bu yaklaşım, Amazon EKS üzerinde çalışan Apache Airflow ile tam kontrol ve olgun araçlar sunmayı vaat ediyordu, metadata depolama için PostgreSQL kullanıldı. Artıları arasında geniş eklenti ekosistemleri ve basit yerel geliştirme ortamları vardı. Ancak, eksileri ölümcül oldu: pod zamanlama gecikmesi ortalama 45 saniye oldu ve bu, duraklamış iş akışlarının neredeyse sıfır hesaplama maliyeti taşıması gerekliliğini ihlal etti. Ayrıca, bölgeler arası PostgreSQL senkron replikasyonunu sürdürmek her görev durum geçişine 200 ms ekledi ve yerleşik tam bir kez gerçekleştirme ayrı bir uygulama düzeyi kilitleme gerektiriyordu, bu da bölgesel geçişlerde sık sık ölü kilitlenmelere yol açıyordu.
Çözüm B: Saf olay yönlendirmeli koroğrafi, Kafka ve Lambda kullanarak
Bu sunucusuz doğası gereği, merkezi bir orkestratör olmaksızın olaylara tepki veren Amazon MSK (Kafka) kaynaklı gerçeklik olarak kullanıldı. Artıları arasında gerçek ödeme-üzerine-kullanım ekonomisi ve kayıt tabanlı dayanıklılık vardı. Ancak, tam bir kez gerçekleştirme sağlamak için DynamoDB (idempotensite için) ve Kafka üzerinden dağıtım işlemleri gerçekleştirilmesi gerekti ve bu da her işlem için 500ms+ gecikmelere yol açtı. Ayrıca, uzun süreli süreçlerin (7 günlük iş akışının 5. günü) durumunu yeniden oluşturmak, S3 arşivlerinden milyonlarca olayı tekrar oynatmayı gerektiriyordu ve bu da toparlanma sürelerinin 10 dakikayı aşmasına neden oldu ve hata meydana geldiğinde "dağıtılmış spagetti"yi hata ayıklamayı imkansız hale getiriyordu.
Çözüm C: Shardlenmiş durum yönetimi ile Dayanıklı İcra Platformu
Seçilen mimari, geçici Lambda işçilerini kalıcı durumdan (CockroachDB ile coğrafi olarak bölümlenmiş tablolar) ayıran özel bir Temporal esinlenmeli kontrol düzlemi uyguladı. Tutarlı Hashing, iş akışı parçalarını bölgesel veritabanı düğümleri arasında dağıtırken, Redis Streams alt milisaniye olay ilişkilendirme tamponlama sağladı. Artıları arasında CockroachDB'nin serileştirilmiş işlemleri ile doğal bir kez gerçekleştirme, hata ayıklama için deterministik yeniden oynatma ve inaktif iş akışlarında yalnızca ucuz S3 anlık görüntülerinde bulunması bulunan gerçek sıfıra ölçeklenme vardı. Eksileri ise, hizmet keşfi için etcd kümelerini sürdürmenin önemli operasyonel karmaşıklığı ve toplu uyandırma senaryolarında kuduz sürülerinin önlenmesi için karmaşık önbellekleme ihtiyacıydı.
Sonuç
Çözüm C'yi kiracı bazında SQS kuyrukları ve 1 saniyelik görünürlük zaman aşımı ile uygulayarak, SwiftCart sonraki Prime Day etkinliğinde 45 dakikalık us-west-2 kesintisine rağmen sıfır iş akışı çoğaltması sağladı. Olay ilişkilendirme p95 gecikmesi, Redis kenar önbelleklemesi aracılığıyla 400ms'ye düştü. Altyapı maliyetleri, her zaman açık EKS yaklaşımına kıyasla %70 azaldı; 85% iş akışı, duraklama bekleme süreleri sırasında yalnızca sıkıştırılmış durum anlık görüntüleri olarak S3'te var oldu ve bu da 1.4M $ yıllık tasarruf sağladı.
Adayların Sıklıkla Atladığı Noktalar
Bir ağ bölünmesi sırasında her iki bölge de olayları eşzamanlı olarak işlerken, iş akışı durumunun farklılaşmasını nasıl önlersiniz?
Çoğu aday, DynamoDB veya Cassandra'da son-yazma-kazanır semantiğini yanlış bir şekilde önermektedir. Bu, iş akışı orkestrasyonu için başarısız olur çünkü iş operasyonları değişmez (örneğin, "siparişi iptal et" ile "siparişi gönder" zaman damgasına göre uzlaştırılamaz). Doğru uygulama, iş akışı durumu metadata'sı içinde gömülü Vektör Saatleri veya Noktalı Sürüm Vektörleri kullanmaktadır. Ağ bölünmesi onarıldığında, sistem eş zamanlı dalları sürüm vektör karşılaştırmasıyla tespit eder ve alan spesifik birleştirme işlevlerini uygular. Birbirine uzlaştırılamayan çelişkiler (örneğin eşzamanlı iptal ve sevkiyat) için mimari, önceki işlemi geri alma işlemini tetikleyen bir saga tazminat modelini uygular ve kapsamlı denetim kayıtlarını tutar. Alternatif olarak, CockroachDB'nin varsayılan serileştirilmiş izolasyonu, bölünme sırasında çelişkili yazıları reddederek tamamen farklılaşmayı önler, çelişkili yazıları reddederek açık yeniden deneme döngüleri zorunlu kılar.
v1.0 üzerinde başlayan ve v2.0'nın etkinlik semantiklerinin değiştiği bir durumda tüm sürüm yönlendirmelerini nasıl gerçekleştirirsiniz?
Adaylar genellikle dayanıklı icra için temel olan Deterministik Yeniden Oynatma gereksinimini gözden kaçırmaktadır. Lambda işlevinin kodunu basitçe güncellemek, yürütülen iş akışlarını kırar çünkü yeniden oynatma mantığı (hatalar sonrası durumu yeniden oluşturmak için kullanılan) orijinal yürütme yolundan sapar ve bu da deterministik istisnalara yol açar. Çözüm, olay kaynaklı işaretleyiciler aracılığıyla açık İş Akışı Sürümleme uygulamasıdır. v2.0'ı dağıtırken, işçiler hem v1.0 hem de v2.0 etkinlik uygulamalarını birlikte desteklemek zorundadır. İş akışı durumu, her bir tarihsel etkinliği hangi kod versiyonunun yürüttüğünü kaydeder; yeniden oynatma sırasında işçi, geçmiş adımların deterministik yeniden yürütülmesini sağlamak için belirli tarihsel sürümün kumandasını yükler, yeni iş akışları ise v2.0'ı kullanır. Maksimum iş akışı süresinden (7 gün ve 24 saatlik bir güvenlik tamponu) sonra, v1.0 kodu devre dışı bırakılabilir. Bu, geriye dönük uyumlu etkinlik imzalarının sonsuza dek sürdürülmesini gerektirir veya sürümler arasındaki davranışsal eşdeğerliği doğrulamak için Pact Sözleşme Testi uygulanmalıdır.
Sağlıklı iş akışları için kesin bir kez gerçekleştirme garantilerini bozmadan sonsuz döngüler veya bellek sızıntıları içeren "zehirli hap" iş akışlarına karşı nasıl koruma sağlarsınız?
Basit Ölü Mektup Kuyruğu (DLQ) aslında tam bir kez gerçekleştirme semantiğini ihlal etmektedir çünkü bir mesajı DLQ'ya taşımak, orijinal mesajı onaylamayı gerektirir ve bu da DLQ yazma işlemi başarısız olursa veya tüketici işlem ortasında çökünce mesaj kaybı riski taşır. Sağlam çözüm, idempotent kontrol noktaları ile İlerleme Takibi uygulanmasıdır. İşçiler, her 30 saniyede bir kalp atışları yapar ve ilerleme jetonlarını etcd veya CockroachDB üzerinde karşılaştır ve değiştirme işlemleri kullanarak yazar. Bir işçi ardışık olarak üç kez aynı iş akışı görevinde çökünce, görev "zehirli" olarak işaretlenir ancak kuyrukta kalır ve görünürlük gecikmesi (1 dakika, 5 dakika, 30 dakika) artan bir şekilde gerçekleşir. Ayrı bir "cerrahi" işçi havuzu, geliştirilmiş gözlemlenebilirlik, bellek sınırlamaları ve ayrıntılı OpenTelemetry izleme ile yürütmeyi dener. Sadece 24 saatlik sürekli başarısızlıktan sonra, iş akışı manuel operatör müdahalesini gerektiren bir "askıya alınmış" duruma geçer, tam bir kez gerçekleştirme değişmezliğini koruyarak çünkü tüm durum geçişleri, atomik karşılaştır ve değiştirme işlemleri için CockroachDB'de MVCC zaman damgalarını kullanmaktadır.