Mimari Ar-Ge numunesi 02 — Referans: kurumsal entegrasyon katmanı
Arızaya dayanıklı olay kuyruğu: kalıcı kabul, sınırlı yeniden deneme, tekrar etkisiz sonuç
Mimari Ar-Ge numunesi: stüdyonun bu depoda kurup ölçtüğü araştırma ve geliştirme çalışması. Müşteri işi değildir ve hiçbir müşteriyi anlatmaz. Bu sayfadaki her rakam ölçülmüş ya da hesaplanmıştır ve yöntemi belirtilmiştir.
Tasarım sorusu
Bir zincirdeki bir sistem durduğunda olaylar ne kaybolmalı ne de iki kez uygulanmalı. Küçük, bağımlılıksız bir durum makinesi en az bir kez teslimi en çok bir kez etkiyle verebilir, bir yeniden başlatmadan ve ölü bir kanaldan sağ çıkabilir ve bunu deterministik arıza senaryolarında gösterebilir mi?
Kanıt katmanı B: çalıştırılabilir testlerle doğrulanan bir referans uygulama. Hiçbir müşterinin sistemine bağlı değildir; hacimler, kimlik bilgileri ve hukuki bağlam bu numunenin iddiasının dışındadır.
I
Kısıt ve tolerans
Üç arıza kipi, her birine yazılı bir tolerans verildi.
Kayıp: üreticisine onaylanmış bir olay, bir yeniden başlatmadan ve ölü bir kanaldan sağ çıkmalıdır. Kabul, onaydan önce yapılan kalıcı bir yazmadır.
Tekrar: ağlar tekrar eder. Teslim en az bir kezdir; bu yüzden alıcı bir olay kimliğini bir kez uygular ve tekrarı, kim gönderirse göndersin, düşürür.
Sınırsızlık: hiçbir olay sonsuza dek yeniden denenemez ya da sonsuza dek tutulamaz. Deneme sayısı, yaş ve her sınırdaki sonuç (ölü mektup kuyruğuna alınır, saklanır, asla atılmaz) politika olarak yazılıdır.
II
Mimari
Zamanlayıcısı ve kendi girdi çıktısı olmayan bir durum makinesi.
Saati, kalıcı depoyu ve kanalı çağıran sağlar; böylece aynı kod deterministik bir simülasyonda, tarayıcıda ve gerçek bir depo ve kanalla bir projede çalışır.
Durumlar: beklemede, yeniden deneme, park edilmiş, teslim edildi, ölü. Başarısız gönderimler üstel geri çekilmeyle yeniden denenir. Bir dizi arıza ve başarısız bir sağlık yoklamasından sonra devre açılır: olaylar depoda park edilir, kanal dönene dek ucuz bir yoklama onu sınar, sonra birikim sırayla boşaltılır.
Zehirli olay yalıtımı: sağlıklı bir kanalda başarısız olan olay kötü bir olaydır, ölü bir kanal değil. Bütçesi içinde yeniden denenir, sonra ölü mektup kuyruğuna alınır ve devre kapalı kalır; böylece tek bir kötü olay arkasındaki kuyruğu bu bütçeden uzun durdurmaz.
III
Doğrulama
Deterministik senaryolar ve sabit bir değişmez kümesi.
Senaryolar arasında yirmi saniye kapalı bir kanal, kararsız bir kanal, gönderimlerin %30’unda kaybolan onaylar, zehirli bir olay, inatçı bir olay, kesinti sırasında yeniden başlatmalar, iki kez gönderen bir üretici ve hepsinin bir arada olduğu durum vardır. Her biri sanal bir saat ve tohumlu bir üreteç kullanır: zamanlayıcı yok, ağ yok.
Her senaryoda sözleşme testleri şunu doğrular: kabul edilen hiçbir olay kaybolmaz, hiçbiri iki kez uygulanmaz, kabul sırası korunur ve hiçbir olay politikanın izin verdiğinden fazla gönderilmez.
Belgelerdeki sonuç tablosu koddan üretilir ve bir testle kodla karşılaştırılır; yani kanıt, kodun bugün yaptığı şeydir.
Katmanların geçerli olduğu yer: bu kuyruk kanıt katmanı B’dir (testlerle doğrulanan referans). Bu sitenin üretimde çalıştırdığı, idempotent teslimli imzalı webhook katman A’dır.
IV
Ölçülen sonuç ve sınırlar
Testlerin çalıştırdığı koddan hesaplanır.
Ölçülen
Bu rakamlar sayfa çizilirken, sözleşme testlerinin çalıştırdığı senaryolar çalıştırılarak hesaplanır. Deterministiktirler: her istekte aynıdır.
- Çalıştırılan senaryo
- 9
- 9 senaryodan 9’si her değişmezi korudu
- Kabul edilen olay
- 370
- tüm senaryolarda
- Kaybolan olay
- 0
- kabul edilen her olay uygulandı, ölü mektup kuyruğuna alındı ya da hâlâ kuyrukta
- İki kez uygulanan olay
- 0
- 56 tekrar düşürüldü
lib/arch/scenarios.ts’den, sayfa çizilirken sözleşme testlerinin çalıştırdığı simülatörle hesaplandı. 5 olay ölü mektup kuyruğuna alındı (saklandı, atılmadı): tasarım gereği zehirli ya da inatçı olaylar.
Ödünleşimler ve sınırlar
Bu desenin bedeli ve müşteriye ihtiyaç duyduğu yer.
En az bir kez, tekrar demektir
Tekrarlar tasarım gereğidir; bu yüzden alıcı onlarla başa çıkmalı ve kimlikleri kuyruğun yeniden deneyebileceği en uzun süreden daha uzun hatırlamalıdır.
Sıra, erişilebilirlikten ödün verir
Katı sırada tek bir başarısız olay, başarılı olana ya da ölü mektup kuyruğuna alınana dek arkasındakileri geciktirir. Birbirinden bağımsız olaylar için kapatın.
Depo bir bağımlılıktır
Kalıcılık, kuyruğa verilen depo kadar güçlüdür. Seçimi (bir veritabanı, yönetilen bir kuyruk) ve kendi garantileri projeye aittir.
Ölçüldüğü ortam
- TypeScript · no dependencies
- Virtual clock · seeded generator
- Node · browser