İçeriğe geç

Mesajın yaşam döngüsü

Klavye: ← → ile gezinin, F tam ekran, O genel bakış.

Tan, işine odaklanmışken

Muhammet Şafak — Sunumlar

Mesajın yaşam döngüsü

Şema, teslim, tekrar, replay: bir mesaj kuyrukta dört kez sınanır.

Muhammet Şafak

Tan, işaret ederken

Gündem

Dört durak

  1. Şemakenarda doğrula
  2. Evrimsözleşmeyi kırmadan
  3. Idempotencyaynı mesaj iki kez
  4. DLQ replaysıfırla, seç, sına

Bölüm 01

Şema

Kuyruk payload'ın içine bakmaz; şekil garantisini kenarda sen eklersin.

Kuyruk byte taşır, tip değil

Şema nerede doğrulanır?

Upstream bir servis payload'dan bir alan düşürdü; worker production'da KeyError fırlattı.

  1. Üretici tarafıbirincil savunma
  2. Tüketici tarafıgüvenlik ağı → DLQ
  3. Şema registrymesaj türü başına

Tüketici tarafı emniyet kemeridir, direksiyon değil.

Muhammet ŞafakŞemayı kuyruğun kenarında doğrulamak · sade.dev

Gevşetmek güvenli, sıkılaştırmak değil

Şemayı kırmadan değiştirmek

Güvenli

  • Opsiyonel alan ekle
  • required kısıtını kaldır
  • Enum'ı genişlet, minimum'u gevşet

Kırıcı

  • Zorunlu alan ekle
  • Alanı kaldır, adlandır, tipini değiştir
  • Enum'ı daralt, kuralı sıkılaştır

Önce tüketiciler yükseltir

Yeni kimlik, paralel yaşam

  1. Adım 1: v2 yayımlaorders:created.v2
  2. Adım 2: v1 sürerüreticiler ikisini yayar
  3. Adım 3: Tüketici göçükendi takviminde
  4. Adım 4: v1 emeklitüketicisi kalmayınca

Bölüm 02

Tekrar

Broker sözünü tutar: mesaj en az bir kez gelir, bazen iki kez.

Aynı mesaj, iki tahsilat

Aynı mesaj iki kez gelebilir. Ücret iki kez çekilmemeli.

Ödeme worker'ı kartı çekti, mesajı ack'leyemeden çöktü; broker yeniden teslim etti, müşteri iki kez ücretlendirildi.

f(f(x)) = f(x)

Idempotent mi değil mi?

Idempotent değilIdempotent
ÖrnekBakiyeyi 10 artırSipariş durumunu paid yap
İki kez+20 eder, ya da iki e-postaEtki bir kez uygulanmışla aynı
GerekenAnahtar + dedupeHiçbir şey gerekmeyebilir

Yan etki seçer

Anahtarı ne zaman kaydedersin?

Eşzamanlı mükerrerlere kontrol değil constraint lazım: anahtar kolonundaki unique constraint ikinci insert'i conflict'e çevirir.
ŞekilKayıt anıPencereUygun olduğu yer
Seen-setHandler başarıyla döndükten sonraVarÜçüncü taraf çağrı: e-posta, çekim
Transactionalİş değişikliğiyle aynı DB transaction'ıYokSahip olduğun bir satır

Anahtarı dürüst tutmak

Anahtar ve constraint

  • GöndericiAnahtarı gönderici üretir: mesaj id'si ya da Idempotency-Key başlığı.
  • PayloadYalnız payload'dan türetme: meşru iki aynı istek çakışır.
  • ConstraintKontrol değil constraint: unique constraint eşzamanlı ikinci insert'i conflict'e çevirir.

Bölüm 03

Replay

Replay byte'ları geri taşımak değil: bir mesajı sıfırla ve güvenle yeniden işle.

20

Örnek senaryo

dakika kesinti

Aşağı akıştaki API yirmi dakika düştü; dört bin mesaj retry'larını tüketip DLQ'ya indi.

Naif replay yeniden zehirler, iki kez faturalar

DLQ'yu güvenle replay etmek

  1. Adım 1: Sıfırlaid, payload, trace_id kalır
  2. Adım 2: Kümeyi seçreason: timeout
  3. Adım 3: Dry-rundokunmadan say
  4. Adım 4: Sandboxyan etkiler stub'lı
  5. Adım 5: Productionilk ikisi sıkıcıysa
Tan, el sallarken

Teşekkürler

sade.dev

Şemayı kenarda doğrula, tekrarı bastır, replay'i sınayarak yap.

Paylaş, göm, indir