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

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

Tan, işine odaklanmışken

Muhammet Şafak — Görseller

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. Şema kenarda doğrula
  2. Evrim sözleşmeyi kırmadan
  3. Idempotency aynı mesaj iki kez
  4. DLQ replay sı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 registry mesaj 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ımla orders: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 emekli tü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ğil Idempotent
Örnek Bakiyeyi 10 artır Sipariş durumunu paid yap
İki kez +20 eder, ya da iki e-posta Etki bir kez uygulanmışla aynı
Gereken Anahtar + dedupe Hiç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.
Şekil Kayıt anı Pencere Uygun olduğu yer
Seen-set Handler başarıyla döndükten sonra Var Üçüncü taraf çağrı: e-posta, çekim
Transactional İş değişikliğiyle aynı DB transaction'ı Yok Sahip olduğun bir satır

Anahtarı dürüst tutmak

Anahtar ve constraint

  • Gönderici Anahtarı gönderici üretir: mesaj id'si ya da Idempotency-Key başlığı.
  • Payload Yalnız payload'dan türetme: meşru iki aynı istek çakışır.
  • Constraint Kontrol 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ırla id, payload, trace_id kalır
  2. Adım 2: Kümeyi seç reason: timeout
  3. Adım 3: Dry-run dokunmadan say
  4. Adım 4: Sandbox yan etkiler stub'lı
  5. Adım 5: Production ilk 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