GH GambleHub

შეცდომების და სტატუსის კოდების დამუშავება

1) რატომ არის შეცდომების სტანდარტიზება?

ერთი შეცდომის კონტრაქტი აჩქარებს მომხმარებელთა გამართვას, ამცირებს ყალბი რეკრუტირებას და RCA- ს რეპროდუქციას ხდის. კარგი სისტემა:
  • პროგნოზირებადი დაშიფვრის პრობლემის ტიპს,
  • აძლევს კლიენტს არსებულ რჩევებს (რა უნდა გააკეთოს შემდეგ),
  • იცავს შიდა ნაწილების გაჟონვისგან
  • თავსებადია ჭრილობებთან და იდემპოტენტურობასთან.

2) დიზაინის პრინციპები

1. შეცდომების ერთი სქემა ყველა სერვისისთვის (REST/GraphQL/gRPC/webhooks).
2. რეპრესიების მკაფიო სემანტიკა: რომელი კოდების გადატვირთვა, რომელი არა.
3. Fail-closed write ოპერაციებზე: უკეთესია 4xx/5xx, ვიდრე მშვიდი არაკონსტიტუციურობა.
4. გაჟონვის გარეშე: არ გაამჟღავნოთ SQL, მინა, კონფიგურაცია, შიდა ID.
5. კვალი: ყოველთვის დააბრუნეთ 'trace _ id '/' correlation _ id'.
6. შეტყობინებების ლოკალიზაცია არჩევითია, მაგრამ კოდი და 'reason' რჩება სტაბილური.


3) ერთიანი ფორმატი (Problem Details/JSON)

რეკომენდებული ძირითადი ფორმატი (თავსებადია RFC 7807- სთან):
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"
}
}
განმარტებები:
  • 'ტიპი' - შეცდომების კლასის სტაბილური URL იდენტიფიკატორი.
  • 'code' არის მოკლე მანქანების დომენის კოდი (სტაბილური გამოშვებებს შორის).
  • 'hint' - რა უნდა გააკეთოს კლიენტმა (გამეორება, განაახლეთ ნიშანი, შეცვალეთ პარამეტრები).
  • 'meta' - უსაფრთხო ნაწილები (საიდუმლოებების გარეშე და PII).

4) სტატუსის კოდების რუკა (მინიმალური ნაკრები)

ავთენტიფიკაცია/ავტორიზაცია

400 Bad Request არის სტრუქტურული შესაბამისობა/სქემა.
401 Unauthorized - არა/არ არის ნიშანი. დაამატეთ 'WWW-Authenticate'.
403 Forbidden არის ავთენტიფიცირებული, მაგრამ არ არსებობს უფლებები/პოლიტიკამ უარი თქვა.
404 Not Found - შენიღბეთ რესურსის არსებობა უფლებების არარსებობის შემთხვევაში.
409 Conflict - ვერსიების/სახელმწიფოების კონფლიქტი (optimistic lock, idempotence).
451 Unavailable For Legal Reasons - შესაბამისობის/იურისდიქციის ბლოკი.

ლიმიტები და დაცვა

408 Request Timeout - კლიენტი სხეულს ძალიან ნელა აგზავნის.
409/425 Too Early - ადრეული გამეორების აკრძალვა 0-RTT/TLS 1. 3.
429 Too Many Requests - ერთად „Retry-After“ და ლიმიტის პოლიტიკა.
499 Client Closed Request - (პერიმეტრზე/NGINX) კლიენტმა შეწყვიტა კავშირი.

მონაცემები და ბიზნეს წესები

422 Unprocessable Content - ბიზნესის პასუხისმგებლობამ გაიარა სქემა, მაგრამ მნიშვნელობა არასწორია.
423 Locked - რესურსი დაბლოკილია (KYC მიმოხილვა, AML freeze).
409 Conflict არის ორმაგი გაგზავნა, რბოლა, სახელმწიფო ლიმიტი (მაგალითად, „უკვე დამუშავებაში“).
410 Gone - ამოიღეს ენდოინტი/რესურსი (დეპრესია დასრულებულია).

სერვერი

500 Internal Server Error - უცნობი შეცდომა; არ გაამჟღავნოთ დეტალები.
502 Bad Gateway - დამოკიდებულებამ დააბრუნა შეცდომა/პროქსი.
503 სერვისი Unavailable - დეგრადაცია/დაგეგმილი სამუშაოები; დამატება 'Retry-After'.
504 Gateway Timeout - დამოკიდებულების ტაიმუტი.

💡 წესი: write ოპერაციები ეჭვმიტანილი 409 (კონფლიქტი) ან 503 (მოგვიანებით განმეორება), არა 200.

5) Retrai და idempotence სემანტიკა

შეუძლებელია გადატვირთვა: 400/401/403/404/422 (თუ კლიენტმა არ შეცვალა მოთხოვნა).
თქვენ შეგიძლიათ დახარჯოთ: 408/429/5xx/425/499/504 (backoff + jitter- ით).
Idempotence: 'POST' - სთვის ჩართეთ 'Idempotency-Key "(UUIDv4).

409 დაუბრუნდით განმეორებით კონფლიქტს 'hint- ით: "Use same Idempotency-Key ან GET Status" ".
დაამატეთ 'Idempotency-Replay: ნამდვილი' შენახული შედეგის დაბრუნებისას.

Headers- ის მაგალითი 429:

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

6) შესვლის შესაბამისობა: ველების შეცდომების სტრუქტურა

400/422 გამოიყენეთ ველების შეცდომების მასივი:
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) ნაწილობრივი მარცხი

Butch endpoints არ მალავს შეცდომებს 200 შიგნით სტრუქტურის გარეშე. დააბრუნეთ 207 Multi-Status ან 200 შედეგების მასივი, სადაც თითოეულ დავალებას აქვს საკუთარი სტატუსი:
json
{
"status": "partial",
"succeeded": 8,
"failed": 2,
"results": [
{"id": "op1", "status": 201},
{"id": "op2", "status": 422, "error": {"code":"VALIDATION_ERROR","detail":"..."}}
]
}

8) პაგინაცია და „ცარიელი“ პასუხები

ცარიელი კოლექცია - 200 'items: []', არა 404.
გვერდის დასასრული - 'შემდეგი _ page _ token' არ არის.
არასწორი ნიშანია 400 c 'code: PAGINATION _ CURSOR _ INVALID'.


9) Webhooks: საიმედო მიწოდება

ხელი მოაწერეთ მოვლენებს (HMAC) და შეამოწმეთ დამუშავებამდე.
წარმატებული დამუშავების პასუხი არის 2xx (უკეთესია, ვიდრე 204).
მიმღების დროებითი წარუმატებლობაა 5xx; გამგზავნი იმეორებს (ექსპონენციალური backoff, jitter).
deduplication 'event _ id' და შედეგის შენარჩუნება (idempotent consumer).
დაუშვებელი payload - 400/422 გამეორების გარეშე.


10) პროტოკოლების შესაბამისობა (gRPC/GraphQL)

gRPC → HTTP:
  • `INVALID_ARGUMENT` → 400
  • `UNAUTHENTICATED` → 401
  • `PERMISSION_DENIED` → 403
  • `NOT_FOUND` → 404
  • `ALREADY_EXISTS` → 409
  • `FAILED_PRECONDITION` → 412/422
  • `RESOURCE_EXHAUSTED` → 429
  • `ABORTED` → 409
  • `UNAVAILABLE` → 503
  • `DEADLINE_EXCEEDED` → 504
GraphQL: ჩვენ ყოველთვის დავუშვებთ 200 სატრანსპორტო დონეზე, მაგრამ შეცდომები ჩადეთ 'errors [] -ში და დუბლირება სათაურებში/გაფართოებებში:
json
{
"data": { "createPayment": null },
"errors": [{
"message": "Forbidden",
"extensions": { "code": "FORBIDDEN", "status": 403, "trace_id": "..." },
"path": ["createPayment"]
}]
}

რეკომენდებულია კრიტიკული შეცდომებისთვის გამოიყენოთ არა 200, არამედ შესაბამისი HTTP კოდი.


11) სათაურები და რჩევები კლიენტისთვის

'Retry-After' - წამები/NTTR თარიღი (429/503/425/408).
'Warning' არის რბილი დეგრადაცია ან დეპრესია („199 - Feature X არის დეპრესიული“).
`Deprecation`, `Sunset`, `Link: <...>; rel = „deprecation“ '- გათიშვისთვის.
'Problem-Type' (კასტომი) - შეცდომების სწრაფი როტინგი კლიენტზე.
'X-Trace-Id '/' Correlation-Id' - აკავშირებს logs/traces.


12) შეტყობინებების უსაფრთხოება

არ გაიმეოროთ შეყვანის საიდუმლოებები (ნიშნები/ხელმოწერები) პასუხის სხეულში.
შენიღბეთ PAN/PII ('1234').
401/403 წლისთვის - არ გაამჟღავნოთ რომელი ატრიბუტი ვერ მოხერხდა.
404 წლისთვის, „resource exists but not yours“ ნაცვლად - უბრალოდ 404.


13) შეცდომების დაკვირვება

მეტრიკა:
  • `http_errors_total{status, route, tenant}`
  • 'error _ classes _ total {code' (სხეულიდან 'code' მიხედვით)
  • წილი 429, 5xx; 'p95 '/' p99' latency ცალკე არასწორი პასუხებისთვის
  • 'retry _ after _ seconds _ bucket' - საბჭოთა ჰისტოგრამის გამეორება
Logs/traces:
  • დააკავშირეთ პასუხი 'trace _ id', შეინახეთ 'code', 'ტიპი', 'status', 'route', 'tenant', PII გარეშე.
ალერტა:
  • ზრდა '5xx _ rate> X%' RPS> N;
  • ზრდა 429 კრიტიკულ მარშრუტებზე;
  • დამოკიდებულების 'timeout/504';
  • ხშირი 409/idempotence არის რბოლების ნიშანი.

14) მაგალითები

14. 1,422 (ბიზნესის ვალდებულება)

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 (იდემპოტენტურობა)


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 (ლიმიტები)

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) ანტიპატერები

დააბრუნეთ 200 შეცდომები ტექსტით სხეულში.
აურიეთ სხვადასხვა შეცდომის ფორმატები მომსახურებებს შორის.
დასტის/SQL/ცხრილების სახელები/შიდა URL 'detail'.
გამოიყენეთ 'მესიჯი' სტაბილური 'კოდის '/' ტიპის' ნაცვლად.
500 დაბრუნება მოსალოდნელი ბიზნეს შეცდომით (მაგალითად, „ბალანსი არასაკმარისია“).
შეუსაბამო სემანტიკა REST/GraphQL/gRPC შორის.


16) iGaming/ფინანსების სპეციფიკა

მკაფიო კოდები KYC/AML/სანქციებისთვის: 'KYC _ REQUIRED', 'KYC _ REVIEW', 'AML _ LOCK', 'SANCTIOOOON N - ს _ B.
იურისდიქციის შეზღუდვები: 451 უსაფრთხო ფორმულირებით, სიების მითითების გარეშე.
ფულადი write ოპერაციები: 409/423 კონკურენციისა და დაბლოკვის დროს, 'hint' გამეორების ფანჯრით.
მოთამაშის ლიმიტების ინვარიანტები: გამოიყენეთ 422 პასუხისმგებელი გადახდის წესების დარღვევისთვის.
აუდიტი: უცვლელი გადაწყვეტილებების ჟურნალები (კოდი, დრო, აქტორი, trace _ id).


17) მზადყოფნის ჩეკის სია

  • ერთი JSON შეცდომის სქემა, სტაბილური 'ტიპი '/' code'.
  • HTTP gRPC/GraphQL შეთანხმებულია და დოკუმენტირებულია.
  • Retry + 'Retry-After' სემანტიკა; იდემპოტენტურობა write- ისთვის.
  • PII/საიდუმლოებების ნიღაბი; 404 რესურსების დამალვისთვის.
  • შეცდომების მეტრიკა და ალერტა; კორელაცია 'trace _ id'.
  • დეპრესიის პოლიტიკოსები: 'დეპრესია', 'Sunset', 'Link'.
  • ტესტები: negative/fuzz, ვერსიების კონფლიქტი, დამოკიდებულების ვარდნა, ორმაგი წყალქვეშა.
  • ჰაიდი მომხმარებლებისთვის: სარეზერვო ოფების მაგალითები და 409/422/429/5xx დამუშავება.

18) TL; DR

სტანდარტიზდება შეცდომების ერთიანი JSON ფორმატი c 'type '/' code '/' trace _ id', გამოიყენეთ სწორი HTTP კოდები, განასხვავეთ ვალიდაცია (400/422), უფლებები (401/403/404), კონფლიქტები/idempotence (409) და ლიმიტები (429). მოდით, მკაფიო 'Retry-After' და 'hint', შეავსეთ მგრძნობიარე მონაცემები, შეაფასეთ შეცდომები 'trace _ id- ით "და ააშენეთ ალერტები 5xx/429/p99.

Contact

დაგვიკავშირდით

დაგვიკავშირდით ნებისმიერი კითხვის ან მხარდაჭერისთვის.ჩვენ ყოველთვის მზად ვართ დაგეხმაროთ!

ინტეგრაციის დაწყება

Email — სავალდებულოა. Telegram ან WhatsApp — სურვილისამებრ.

თქვენი სახელი არასავალდებულო
Email არასავალდებულო
თემა არასავალდებულო
შეტყობინება არასავალდებულო
Telegram არასავალდებულო
@
თუ მიუთითებთ Telegram-ს — ვუპასუხებთ იქაც, დამატებით Email-ზე.
WhatsApp არასავალდებულო
ფორმატი: ქვეყნის კოდი და ნომერი (მაგალითად, +995XXXXXXXXX).

ღილაკზე დაჭერით თქვენ ეთანხმებით თქვენი მონაცემების დამუშავებას.