İçeriğe geç
Belgeler menüsüİdempotentlik

İ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.

@metrics/node · TypeScript
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, accepted içinde); bir kez saklanır.
  • Reddedilen mesajı (rejected[]) düzeltmeden tekrar göndermeyin; yine reddedilir.
  • 5xx ve ağ hatalarında aynı messageId ile üstel geri çekilmeyle tekrar deneyin.
  • 429 (rate_limited) hız sınırıdır ve partiden hiçbir mesaj saklanmamıştır: Retry-After baş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.