GH GambleHub

Hata İşleme ve Durum Kodları

1) Hataları neden standartlaştırın

Tek bir hata sözleşmesi, istemci hata ayıklamayı hızlandırır, yanlış geri izlemeleri azaltır ve RCA'yı oynatılabilir hale getirir. İyi sistem:
  • Tahmin edilebileceği gibi, sorunun türünü kodlar,
  • Müşteriye geçerli istemleri verir (daha sonra ne yapmalı),
  • İç parçaların sızıntısına karşı korur,
  • Retras ve idempotency ile uyumludur.

2) Tasarım ilkeleri

1. Tüm hizmetler için bir hata şeması (REST/GraphQL/gRPC/webhooks).
2. Geri çekilmelerin açık semantiği: hangi kodların geri çekileceği, hangilerinin çekilmeyeceği.
3. Yazma işlemlerinde başarısız-kapalı: sessiz tutarsızlıktan daha iyi 4xx/5xx.
4. Sızıntı yok: SQL, yığınlar, yapılandırmalar, dahili kimlikleri açıklamayın.
5. Trace - Her zaman 'trace _ id'/' correlation _ id' döndürün.
6. İletilerin yerelleştirilmesi isteğe bağlıdır, ancak kodlar ve 'reason' sabit kalır.


3) Tek format (Sorun Ayrıntıları/JSON)

Önerilen temel format (RFC 7807 uyumlu):
json
{
"type": "https://errors.example.com/auth/invalid-token",
"title": "Invalid access token",
"status": 401,
"code": "AUTH_INVALID_TOKEN",
"detail": "Token expired or signature invalid.",
"instance": "/api/v1/payments/12345",
"trace_id": "01HX3...ABC",
"hint": "Obtain a new token via OAuth2 refresh.",
"meta": {
"scope": "payments:write",
"policy": "deny-by-default"
}
}
Açıklamalar:
  • 'type' kararlı bir hata sınıfı URL'sidir.
  • 'kod' - kısa etki alanı makine kodu (sürümler arasında kararlı).
  • 'hint' - müşteri için ne yapmalı (tekrar et, tokeni güncelle, parametreleri değiştir).
  • 'meta' - güvenli parçalar (sırlar ve PII olmadan).

4) Durum kodu haritası (minimum set)

Kimlik Doğrulama/Yetkilendirme

400 Bad Request - yapısal doğrulama/şema.
401 Yetkisiz - hayır/geçersiz belirteç. 'WWW-Authenticate' ekleyin.
403 Yasak - kimliği doğrulanmış ancak hakları/politikaları reddedilmiş.
404 Bulunamadı - hakları olmayan bir kaynağın varlığını maskeleyin.
409 Çatışma - sürüm/durum çatışması (iyimser kilit, idempotency).
451 Yasal Nedenlerle Kullanılamıyor - Uyum/Yargı Bloğu.

Sınırlar ve koruma

408 İstek Zaman Aşımı - Müşteri vücudu çok yavaş gönderiyor.
409/425 Çok Erken - 0-RTT/TLS 1'de erken tekrarın yasaklanması. 3.
429 Çok Fazla İstek - 'Retry-After've limit politikası ile.
499 İstemci Kapalı İsteği - (çevre/NGINX) istemci bağlantıyı kesti.

Veri ve İş Kuralları

422 İşlenemez İçerik - iş doğrulaması şemayı geçti, ancak anlamı yanlış.
423 Kilitli - kaynak engellendi (KYC incelemesi, AML dondurma).
409 Çatışma - çift gönderme, ırk, durum sınırı (örneğin, "zaten işlemde").
410 Gone - uç nokta/kaynak silindi (kullanımdan kaldırma tamamlandı).

Sunucu

500 Dahili Sunucu Hatası - bilinmeyen hata; Detayları açıklamıyor.
502 Bad Gateway - bağımlılık döndürülen hata/proxy oluşturma.
503 Hizmet Kullanılamıyor - bozulma/planlı çalışma; 'Retry-After' ekleyin.
504 Ağ Geçidi Zaman Aşımı.

💡 Kural: şüphe üzerine yazma işlemleri - 409 (çakışma) veya 503 (daha sonra tekrarlayın), 200 değil.

5) Retray ve idempotency semantik

400/ 401/403/404/422'ü geri çekemezsiniz (müşteri isteği değiştirmedikçe).
Geri çekebilirsiniz: 408/429/5xx/ 425/499/504 (backoff + jitter ile).
Idempotency: 'POST' için 'Idempotency-Key' (UUIDv4) seçeneğini etkinleştirin.

Yeniden deneme çakışması için 409'u 'hitt: "Use same Idempotency-Key or GET status'ile döndürün.
Kaydedilmiş bir sonucu döndürürken 'Idempotency-Replay: true' ekleyin.

429'daki örnek başlıklar:

HTTP/1.1 429 Too Many Requests
Retry-After: 3
RateLimit-Limit: 50
RateLimit-Remaining: 0
RateLimit-Reset: 1730641030

6) Giriş doğrulama: alan hata yapısı

400/422 için bir dizi alan hatası kullanın:
json
{
"type": "https://errors.example.com/validation",
"title": "Validation failed",
"status": 422,
"code": "VALIDATION_ERROR",
"trace_id": "01HX4...XYZ",
"errors": [
{"field": "amount", "rule": "min", "message": "Must be >= 10"},
{"field": "currency", "rule": "enum", "message": "Unsupported currency"}
]
}

7) Kısmi arızalar (toplu/kısmi arıza)

Toplu uç noktalarda, yapısız 200'ün içindeki hataları gizlemeyin. Her görevin kendi durumuna sahip olduğu bir dizi sonuçla 207 Çoklu Durum veya 200 döndürün:
json
{
"status": "partial",
"succeeded": 8,
"failed": 2,
"results": [
{"id": "op1", "status": 201},
{"id": "op2", "status": 422, "error": {"code":"VALIDATION_ERROR","detail":"..."}}
]
}

8) Pagination ve "boş" cevaplar

Boş koleksiyon - 200 s 'öğeleri: []', değil 404.
Sayfa sonu - 'next _ page _ token' eksik.
Yanlış belirteç - 400'lerin kodu: PAGINATION_CURSOR_INVALID'.


9) Webhooks: Güvenilir Teslimat

Olayları imzala (HMAC) ve işlemeden önce kontrol et.
Başarılı işleme yanıtı 2xx (en iyi 204).
Alıcı geçici arızalar - 5xx; Gönderen tekrar eder (üstel geri alma, jitter).
'Event _ id'ile veri tekilleştirme ve sonucu kaydetme (idempotent consumer).
Geçersiz yük - 400/422 yeniden deneme yok.


10) Protokol uygunluğu (gRPC/GraphQL)

gRPC - HTTP:
  • 'INVALID _ ARGÜMAN' - 400
  • 'ONAYLANMADI' - 401
  • 'PERMISSION _ DENIED' - 403
  • 'NOT _ FOUND' - 404
  • 'ALREADY _ EXISTS' - 409
  • 'FAILED _ PRECONDITION' - 412/422
  • 'RESOURCE _ BITKIN' - 429
  • 'İPTAL EDİLDİ' - 409
  • 'ULAŞILAMAZ' - 503
  • 'DEADLINE _ EXCEEDED' - 504
GraphQL: taşıma katmanında her zaman 200 geçerlidir, ancak hataları 'errors []'a yerleştirin ve başlıklara/uzantılara çoğaltın:
json
{
"data": { "createPayment": null },
"errors": [{
"message": "Forbidden",
"extensions": { "code": "FORBIDDEN", "status": 403, "trace_id": "..." },
"path": ["createPayment"]
}]
}

Kritik hatalar için 200 yerine karşılık gelen HTTP kodunun kullanılması önerilir.


11) Başlıklar ve müşteri ipuçları

'Retry-After' - saniye/HTTP tarihi (429/503/425/408).
'Uyarı' - yumuşak bozulma veya kullanımdan kalkma ("199 - Feature X is depressed").
'Amortisman', 'Günbatımı', 'Bağlantı: <...>; rel = "amortisman" '- kontrollü kapatma için.
'Problem Tipi' (özel) - istemci üzerinde hızlı hata yönlendirme.
'X-Trace-Id'/' Correlation-Id' - günlükleri/izleri bağlar.


12) Mesaj güvenliği

Yanıt gövdesinde girdi sırlarını (belirteçleri/imzaları) tekrarlamayın.
Maske PAN/PII ('1234').
401/403 için - hangi özniteliğin başarısız olduğunu açıklamayın.
404 için, "kaynak var ama sizin değil" yerine - sadece 404.


13) Hataların gözlemlenebilirliği

Metrikler:
  • 'http _ errors _ total {durum, rota, kiracı}'
  • 'error _ classes _ total {code}' (gövdeden 'kod'ile)
  • Hisse 429, 5xx; Hatalı cevaplar için ayrı ayrı 'p95'/' p99' gecikme
  • 'retry _ after _ seconds _ bucket' - tekrarlama ipuçlarının histogramı
Günlükler/yollar:
  • Yanıtı 'trace _ id'ile ilişkilendirir,' code ',' type ',' status ',' route ',' tenant ', PII içermez.
Uyarılar:
  • RPS> N'de spike '5xx _ rate> X %';
  • Kritik güzergahlarda 429 büyüme;
  • bağımlılıkların 'zaman aşımı/504';
  • Sık sık 409/idempotency - bir yarış işareti.

14) Örnekler

14. 1.422 (iş doğrulama)

json
{
"type": "https://errors.example.com/payments/limit-exceeded",
"title": "Limit exceeded",
"status": 422,
"code": "PAYMENT_LIMIT_EXCEEDED",
"detail": "Daily withdrawal limit reached for KYC1.",
"hint": "Increase limits after KYC2 or try tomorrow.",
"trace_id": "01J5...XYZ"
}

14. 2,409 (idempotency)


HTTP/1.1 409 Conflict
Idempotency-Replay: true
json
{
"type": "https://errors.example.com/idempotency/replay",
"title": "Duplicate request",
"status": 409,
"code": "IDEMPOTENT_REPLAY",
"detail": "A request with the same Idempotency-Key was already processed.",
"hint": "Reuse the same Idempotency-Key and GET the operation status."
}

14. 3,429 (limitler)

json
{
"type":"https://errors.example.com/rate/too-many-requests",
"title":"Too many requests",
"status":429,
"code":"RATE_LIMITED",
"detail":"Per-key rate limit exceeded.",
"hint":"Retry after the time specified in Retry-After header."
}

15) Antipatterns

Gövde hata metni ile 200 döndürün.
Hizmetler arasında farklı hata formatlarını karıştırın.
Yığın/SQL/tablo adlarını/dahili URL'leri 'detail' içinde genişletin.
Stabil 'code'/' type' yerine 'message' kullanın.
Beklenen bir iş hatası oluştuğunda 500'ü döndürün (örneğin, "bakiye yetersiz").
REST/GraphQL/gRPC arasında tutarsız semantik.


16) iGaming/Finansın Özellikleri

KYC/AML/yaptırımlar için açık kodlar: 'KYC _ REQUIRED', 'KYC _ REVIEW', 'AML _ LOCK', 'SANCTION _ BLOCKED'.
Yargı kısıtlamaları: Listeleme olmadan güvenli ifadeler ile 451.
Parasal yazma işlemleri: Rekabet ve kilitler için 409/423, bir redo penceresi ile 'ipucu'.
Oyuncu sınırı değişmezleri: Sorumlu ödeme ihlalleri için 422 kullanın.
Denetim: Değiştirilemeyen çözüm günlükleri (kod, zaman, aktör, trace_id).


17) Prod Hazırlık Kontrol Listesi

  • Tek JSON hata şeması, kararlı 'tip'/' kod'.
  • HTTP ↔ gRPC/GraphQL haritalama tutarlı ve belgelenmiştir.
  • Retray semantiği + 'Retry-After'; Yazma için idempotency.
  • PII/gizli maskeleme; 404 kaynakları gizlemek için.
  • Hata ve uyarı metrikleri; 'trace _ id'ile korelasyon.
  • Amortisman politikaları: 'Amortisman', 'Günbatımı', 'Bağlantı'.
  • Testler: negatif/fuzz, sürüm çakışması, bağımlılık düşüşü, çift gönderme.
  • Müşteri rehberi: Geri dönüş örnekleri ve 409/422/429/5xx işleme.

18) TL; DR

'Type'/' code'/' trace _ id'ile tek bir JSON hata formatını standartlaştırın, doğru HTTP kodlarını kullanın, doğrulama (400/422), (401/403/404 hakları), çakışmalar/idempotency (409) ve limitler (429) arasında ayrım yapın. Net 'Retry-After've' ipucu 'verin, hassas verileri maskeleyin,' trace _ id'ile hataları kaydedin ve 5xx/429/p99 ile uyarılar oluşturun.

Contact

Bizimle iletişime geçin

Her türlü soru veya destek için bize ulaşın.Size yardımcı olmaya her zaman hazırız!

Entegrasyona başla

Email — zorunlu. Telegram veya WhatsApp — isteğe bağlı.

Adınız zorunlu değil
Email zorunlu değil
Konu zorunlu değil
Mesaj zorunlu değil
Telegram zorunlu değil
@
Telegram belirtirseniz, Email’e ek olarak oradan da yanıt veririz.
WhatsApp zorunlu değil
Format: +ülke kodu ve numara (örneğin, +90XXXXXXXXX).

Butona tıklayarak veri işlemenize onay vermiş olursunuz.