Mesajın yaşam döngüsü
Klavye: ← → ile gezinin, F tam ekran, O genel bakış.

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

Gündem
Dört durak
- 01Şemakenarda doğrula
- 02Evrimsözleşmeyi kırmadan
- 03Idempotencyaynı mesaj iki kez
- 04DLQ 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ı.
- Üretici tarafıbirincil savunma
- Tüketici tarafıgüvenlik ağı → DLQ
- Şema registrymesaj türü başına
Tüketici tarafı emniyet kemeridir, direksiyon değil.
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
- 1Adım 1: v2 yayımla
orders:created.v2 - 2Adım 2: v1 sürer
üreticiler ikisini yayar - 3Adım 3: Tüketici göçü
kendi takviminde - 4Adı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?
| Ş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ö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
- 1Adım 1: Sıfırla
id, payload, trace_id kalır - 2Adım 2: Kümeyi seç
reason: timeout - 3Adım 3: Dry-run
dokunmadan say - 4Adım 4: Sandbox
yan etkiler stub'lı - 5Adım 5: Production
ilk ikisi sıkıcıysa

Teşekkürler
Şemayı kenarda doğrula, tekrarı bastır, replay'i sınayarak yap.