Konuyu Açan
#1
E-ticaret entegrasyonlarında webhook’u bir kez gelir varsayımıyla yazmak, testte sorunsuz görünse de gerçek trafikte çift sipariş veya iki kez stok düşümü gibi can sıkıcı sonuçlara yol açabiliyor. Ödeme sağlayıcısı aynı olayı yeniden gönderebilir; bu yüzden webhook’u “tek seferlik bildirim” değil, tekrar işlenebilecek bir mesaj olarak ele almak gerekiyor.
Benim için üç nokta kritik:
Bir ayrıntı daha: İmza doğrulama bazı sağlayıcılarda ham istek gövdesi gerektiriyor; JSON’u parse edip yeniden serileştirmek doğrulamayı bozabilir.
Siz olay kimliğini mi, ödeme niyetini mi tekilleştiriyorsunuz; kullandığınız yapıda yarış koşullarını nasıl kapattınız?
Benim için üç nokta kritik:
- Önce kalıcı kayıt, sonra başarılı yanıt: İmzayı doğruladıktan sonra olay kimliğini veritabanına kaydediyorum. Kayıt tamamlanmadan 2xx dönmek, uygulama hemen ardından çökerse olayın kaybolmasına neden olabilir.
- Tekillik kuralını veritabanına koyun: Olay kimliği üzerinde unique constraint kullanmak, iki eşzamanlı isteğin uygulama kodundaki “önceden var mı?” kontrolünü aynı anda geçmesini engeller. Tek başına bellekte tutulan bir Set, birden fazla Node.js sürecinde yeterli değildir.
- Ağır işleri webhook isteğinden ayırın: E-posta gönderme veya muhasebe senkronizasyonu gibi işleri kalıcı bir kuyruğa aktarın. Kuyruğa yazma ile olay kaydının birlikte güvenceye alınması için transactional outbox yaklaşımı da değerlendirilebilir.
Bir ayrıntı daha: İmza doğrulama bazı sağlayıcılarda ham istek gövdesi gerektiriyor; JSON’u parse edip yeniden serileştirmek doğrulamayı bozabilir.
Siz olay kimliğini mi, ödeme niyetini mi tekilleştiriyorsunuz; kullandığınız yapıda yarış koşullarını nasıl kapattınız?