Temeller

Idempotency

Aynı isteği iki kez göndermek ikinci kaydı doğurmasın — Idempotency-Key nasıl çalışır.

Ağ güvenilir değildir. Bir POST gönderirsin, yanıt gelmez — istek sunucuya ulaştı mı, ulaşmadı mı bilemezsin. Yeniden gönderirsen ikinci bir kayıt oluşabilir; göndermezsen hiç oluşmamış olabilir.

Idempotency-Key bu belirsizliği kaldırır.

Kullanımı

bash
curl -X POST "https://acme.crm.blesyum.app/api/crm/public/v1/contacts" \
  -H "Authorization: Bearer blsk_..." \
  -H "Idempotency-Key: 9f2c1e40-6b3d-4a1f-9c2e-7d5b8a1f3c4e" \
  -H "Content-Type: application/json" \
  -d '{"email":"ayse@ornek.com","name":"Ayşe Yılmaz"}'

Aynı anahtarla ikinci kez gönderirsen: yeni kayıt oluşmaz, ilk isteğin yanıtı aynen döner. Aynı durum kodu, aynı gövde.

Anahtarı sen üretirsin

Anahtar senin ürettiğin, benzersiz bir değerdir (UUID iyi bir seçimdir). Doğru desen: anahtarı isteği kurarken bir kez üret ve tüm yeniden denemelerde aynısını kullan.

ts
const idemKey = crypto.randomUUID();

async function kisiOlustur(govde: unknown) {
  // Yeniden denemelerin HEPSİ aynı anahtarı taşır — yoksa idempotency'nin
  // hiçbir anlamı kalmaz.
  return istekAt(url, {
    method: "POST",
    headers: { "Idempotency-Key": idemKey, "Content-Type": "application/json" },
    body: JSON.stringify(govde),
  });
}

Her denemede yeni bir anahtar üretmek, idempotency'yi kapatmakla aynı şeydir. Bu en sık yapılan hatadır.

Aynı anahtar, farklı gövde → 409

Sunucu isteğin bir parmak izini tutar: metot + yol + gövdenin özeti. Aynı anahtarla farklı bir gövde gönderirsen 409 alırsın:

json
{ "error": { "code": "CORE-REQ-0005",
             "message": "Bu idempotency anahtarı farklı bir istekle kullanılmış." } }

Bu bir koruma: anahtarı yanlışlıkla yeniden kullanmak, iki farklı işlemden birinin sessizce kaybolması demek olurdu.

Süre

Kayıtlar 24 saat saklanır. Bu süre içinde aynı anahtarla gelen istek tekrar oynatılır; sonrasında anahtar serbest kalır.

Yarım kalan istek

İlk istek işlenirken çökme olursa kayıt "kilitli" kalır. Bu kilit 60 saniye sonra otomatik serbest bırakılır ve istek yeniden çalıştırılabilir — kalıcı bir 409 duvarı oluşmaz.

Hangi uçlarda

Yan etkisi olan tüm yazma uçlarında kullanabilirsin. GET isteklerinde anlamı yoktur (zaten idempotenttirler) ve yok sayılır.

Kuyruk/worker'dan çağrı yapıyorsan idempotency anahtarını iş kaydının kimliğinden türet (job:{id}). Böylece iş yeniden denendiğinde anahtar kendiliğinden aynı olur ve ayrıca saklamana gerek kalmaz.