İdempotentlik. Bir olay, bir kez.
Tracking API her messageId + timestamp çiftini bir kez saklar. Aynı gerçek olaya her seferinde aynı kimliği verirseniz tekrar denemeler, iki kez gelen webhook’lar ve yeniden çalışan işler olayı iki kez saydırmaz.
Belirleyici kimlik üretin
Kimliği rastgele değil, gerçek olaydan üretin: purchase:<sipariş no>, trial_started:<hesap kimliği>. Olay iki kez üretilebiliyorsa timestamp olarak “şimdi”yi değil iş zamanını (ödemenin alındığı an) gönderin.
messageId en çok 100 yazdırılabilir ASCII karakterdir. Gönderilmezse sunucu içerik özetinden üretir; sunucu SDK’sı da eksik kimliğe rastgele bir UUID verir. İş olaylarında buna güvenmeyin.
import { deterministicMessageId } from '@metrics/node';
deterministicMessageId('purchase_completed', order.id); // siparişe bir satın alma
deterministicMessageId('subscription_renewed', sub.id, period.start.toISOString());Tekrar eden mesajın yanıtı
- Tekrar eden mesaj kabul edilmiş sayılır (
200,acceptediçinde); bir kez saklanır. - Reddedilen mesajı (
rejected[]) düzeltmeden tekrar göndermeyin; yine reddedilir. - 5xx ve ağ hatalarında aynı
messageIdile üstel geri çekilmeyle tekrar deneyin. 429(rate_limited) hız sınırıdır ve partiden hiçbir mesaj saklanmamıştır:Retry-Afterbaşlığındaki saniye kadar bekleyin, aynı partiyi aynımessageId’lerle tekrar gönderin.
Kaybolmaması gereken olaylar
Kayıt, satın alma ve yenileme gibi olayları iş işleminizle aynı veritabanı işleminde yazın: @metrics/node/outbox-pg olayı ON CONFLICT (message_id) DO NOTHING ile giden kutusuna ekler, gönderici gerisini yapar.