Ödeme geldi, e-posta gitmedi: outbox deseniyle tutarlılık
Ödeme, kayıt ve bildirim aynı anda doğru olmalı. Novademi ve PDR'da bunu veritabanı outbox'ları ve ayrı worker süreçleriyle nasıl sağlıyoruz.
Bir ödeme webhook'u geldiğinde üç şey olmalı: sipariş ödendi olarak işaretlenmeli, öğrenciye kurs erişimi tanımlanmalı ve bir onay e-postası gitmeli. E-posta servisine istek atmak veritabanı transaction'ının içinde yapılırsa, servis yavaşladığında ödeme işlemi de yavaşlar; dışında yapılırsa, süreç tam o anda kapanırsa e-posta hiç gitmez.
Önce yaz, sonra gönder
Outbox deseninde e-posta göndermek yerine "gönderilecek" kaydını, siparişi güncelleyen aynı transaction içinde bir outbox tablosuna yazarız. Ya ikisi birden olur ya hiçbiri. Ayrı bir worker süreci bu tabloyu okur, gönderimi yapar ve başarısız olursa üstel bekleme ile yeniden dener.
- Novademi'de ticaret ve bildirim için iki ayrı outbox var; worker'lar kayıtları FOR UPDATE SKIP LOCKED ile kiralar, böylece iki worker aynı işi almaz.
- Siparişler idempotency anahtarı taşır; aynı istek iki kez gelirse ikinci kez ücret alınmaz.
- PDR'da e-posta ve SMS aynı outbox'tan beslenir; worker üretimde ayrı bir süreç olarak çalışır.
Sonuç: ödeme tarafı hızlı ve kesin, bildirim tarafı dayanıklı. Kuyruk için ayrı bir altyapıya ihtiyaç duymadan, zaten güvendiğimiz veritabanıyla.

