Idempotency, aynı isteğin birden fazla kez gönderilmesi durumunda yalnızca bir kez işlenmesini sağlayan bir mekanizmadır. Bu özellik, özellikle ağ sorunları veya zaman aşımı durumlarında mükerrer kayıtların oluşmasını önler.
Idempotency özelliği aşağıdaki senaryolarda kritik öneme sahiptir:
| Senaryo | Açıklama |
|---|---|
| Ağ Zaman Aşımı | İstek sunucuya ulaştı ve işlendi, ancak yanıt istemciye ulaşamadı. İstemci isteği tekrar gönderdiğinde mükerrer kayıt oluşabilir. |
| Bağlantı Kesintisi | İstek gönderilirken bağlantı koptu, isteğin işlenip işlenmediği belirsiz. |
| Yeniden Deneme (Retry) | Otomatik retry mekanizması olan sistemlerde aynı isteğin birden fazla kez gönderilmesi. |
Örnek Senaryo: Bir gönderi oluşturma isteği gönderdiniz. Sunucu gönderiyi oluşturdu ancak yanıt dönerken bağlantı koptu. Sisteminiz isteği tekrar gönderdi. Idempotency olmadan iki ayrı gönderi oluşurdu.
Idempotency özelliğini kullanmak için isteğinize X-Idempotency-Key header'ı eklemeniz yeterlidir.
| Header | Değer | Zorunluluk |
|---|---|---|
X-Idempotency-Key |
Benzersiz string (UUID, sipariş numarası vb.) | OPSİYONEL |
Not: Bu header gönderilmezse idempotency kontrolü yapılmaz ve istek normal şekilde işlenir.
curl -X POST "{{BASE_URL}}/api/v1/consignments" \
-H "Content-Type: application/json" \
-H "APIKEY: {{APIKEY}}" \
-H "X-Idempotency-Key: order-12345-shipment-001" \
-d '{
"provider_id": 1,
"preference": 0,
...
}'
İstek normal şekilde işlenir ve başarılı yanıt cache'lenir.
Belirli bir süre içinde aynı X-Idempotency-Key ile tekrar istek geldiğinde:
Eğer ilk istek hata ile sonuçlandıysa (HTTP 4xx veya 5xx), yanıt cache'lenmez. Bu sayede hatalı istekler düzeltilerek tekrar gönderilebilir.
Idempotency aktif olan başarılı isteklerde aşağıdaki header'lar yanıta eklenir:
| Header | Açıklama |
|---|---|
X-Idempotency-Key |
Gönderilen idempotency key değeri |
X-Idempotency-Stored-At |
Yanıtın cache'lendiği zaman (Unix timestamp) |
Aşağıdaki endpoint'ler idempotency özelliğini desteklemektedir:
| Endpoint | Metod | Açıklama |
|---|---|---|
/api/v1/consignments |
POST | Yurtiçi/Yurtdışı gönderi oluşturma |
/api/v1/consignments/multi-package |
POST | Çoklu paket gönderi oluşturma |
/api/v1/consignments/draft |
POST | Taslak gönderi oluşturma |
Idempotency key seçerken aşağıdaki önerileri dikkate alın:
| Öneri | Açıklama |
|---|---|
| Benzersiz olmalı | Her farklı işlem için farklı bir key kullanın |
| Tahmin edilebilir olmalı | Aynı işlem için her zaman aynı key'i üretebilmelisiniz |
| İş mantığına bağlı olmalı | Sipariş numarası, işlem ID'si gibi iş mantığınızdaki benzersiz değerleri kullanın |
# Sipariş bazlı
order-{sipariş_no}-shipment
# UUID
550e8400-e29b-41d4-a716-446655440000
# Tarih + işlem bazlı
2024-01-15-order-12345
Uyarı: Rastgele üretilen key'ler (örn: her retry'da yeni UUID) idempotency amacını ortadan kaldırır. Key, aynı işlem için her zaman aynı değeri üretmelidir.