Ինչո՞ ւ է կարևոր հետևել API կայունությանը
API-ն պայմանագիր է։ Նրա անկայունությունը վերածվում է հակադարձումների անկման, ձախողումների, վճարումների ձախողման և տաք ֆիքսների ծախսերի։ Պիտերբուրգը ոչ թե «ոչինչ չի փոխի», այլ կառավարվող փոփոխությունները հստակ գծերով և չափված SLO-ով։ Ներքևում 'ինչպես կառուցել կայուն API-ներ, որոնք անհանգստացած են ածխաջրածիններով, պինդ բեռներով և գործընկերային բեռներով։
1) Ի՞ նչ է «API» -ը, և ինչո՞ ւ է դա փողը։
Կանխատեսելիությունը 'նույն գործողությունը նույն արդյունքն է (նույն կոնտեքստով)։- Համատեղելիությունը 'նոր տարբերակները չեն կոտրում գոյություն ունեցող հաճախորդներին։
- Հասանելիություն և արտադրողականություն 'ցածր p95/p99 լատենտ, նվազագույն սխալ։
- Փոփոխությունների կառավարումը 'պլանավորված դեպրեսիաները առանց «անակնկալների»։
Բիզնես էֆեկտը 'ավելի քիչ ստանդարտ, ավելի բարձր փոխադարձությունից, ավելի արագ, քան Time-to-Market-ը (ավելի քիչ պայմանագրեր և ձեռքով խոտֆիքսներ)։
2) Առաջին հերթին Պայմանագիրը
Հատուկ 'OpenAPI/AsyncAPI + միակ ճշմարտության աղբյուրը (repo + CI ստուգումներ)։- Կոշտ պայմանագրեր 'տեսակներ, դաշտերի պարտավորություն, սխալներ, սեմանտիկա։ «հանգիստ» փոփոխությունների արգելքը։
- Ինտեգրման մակարդակները
- Backwards compatible-ը (էներգիայի դաշտերի ավելացում, նոր արժեքներ enum, նոր endpoints)։
- Breaking (հեռացում/վերանվանումը, տեսակների/սեմանտիկայի փոփոխությունը, վալիդացիայի խստացումը)։
- Պայմանագրային թեստերը ՝ Pact/Swagger-based, պրովայդերը չի կարող դուրս գալ, եթե կոտրում է հրատարակված սպառողական սպասումները։
3) SLI/SLO և սխալ բյուջե
SLI 'հաջողակ հարցումների մասնաբաժինը, p95/p99 latency, 5xx/4xx-ը կոդերով, կուռքերի մասնաբաժինը։
SLO (օրինակ) 'Հաջողություն 3699։ 95%, p95-100 ms (read) և 35300 ms (write), 5xx 240։ 05%.
Error Budget: փոփոխություններ/փորձարկումներ; սպառման դեպքում կենտրոնանում է ռիսկային օրինագծերի վրա և արգելում։
4) Idempotenty, retray և գործարքներ
Idempotent բանալիները write վիրահատությունների համար (վճարումներ, տոկոսադրույքներ, պատվերներ) 'նույն արդյունքը։
Կրկնվող ձևանմուշները ՝ retry, էքսպոնենցիալ ուշացումով և ջիթերով, սերվերի կողմում դեդոպլիկացիա։- Idempotent արդարությունը '«www.co.ru settle» (դրամական վիրահատություններ) հստակ TTL և կարգավիճակներով։
- Սխալների սեմանտիկան ՝ 407/422 հակամարտությունների համար, 429 լիմիտների համար, 503/504 դեգրադացիայի համար, հստակ «reason _ code»։
5) Սխեմաների տարբերակումը և էվոլյուցիան
Ռազմավարություն 'SemVer-ի համար, URL/վերնագրեր API տարբերակների համար ("/v1 ", "/v2" կամ "Accept: Accept: Applant/vnd. api+json; v=2`).
Օրենքի կանոնները- Ավելացրեք դաշտերը որպես կարգավորող։ երբեք մի փոխեք դաշտային տեսակը։
- Ընդլայնեք Էնումը, ոչ թե վերագտնեք։ հաճախորդները պետք է կարողանան անտեսել անհայտ արժեքները։
- Breaking-ի համար նոր տարբերակ է, դե ֆակտո պայմանագրի «ֆորկ»։
- Deprecation policy: Գովազդը բացատրվում է աջակցության ժամանակահատվածով (օրինակ, 6-12 ամիս) կատարվում է հիբրիդային անջատումը։ կարգավիճակ-էջ և changelog։
6) Դիտողությունն ու միջադեպերի կառավարումը
Մետրիկները (Prometheus/OTel) 'հաջողությունը, latency (p50/p95/p99), RPS, saturation (CPU/heap), տեսակների սխալները։
Թրեյսինգը ՝ www.relation id (օրինակ ՝ «X-Request-ID»), hops (gateway no BFF)։- Լոգները 'կառուցվածքային, PII-safe, «tenault», «version», «client _ id», «idempotency _ key» դաշտերով։
- Alerts: SLO-ծնունդ, 5xx/429 աճը, p99 աճը, «Time-box» -ը։
- Միջադեպերը 'պլեյբուկ, կապի ջրանցքներ, հետմորտը action items-ի հետ և SLO/շեմերի փոփոխությունը, եթե անհրաժեշտ է։
7) Արտադրողականություն և կայունություն
Rate limiting / quotas: per-client/per-token; ազնիվ պատասխաններ 429 «Retry-After» -ի հետ։
Circuit breaker/bulkhead 'կախվածության մեկուսացում, տեղական ֆոլբեքներ։- Քեշինգը ՝ ETag/If-None-Match, «Cache-Corl» read; Server-side cash տաք բեկորների վրա։
- Պագինացիա ՝ cursor-based, էջերի չափի լիմիտներ։ խուսափեք «ծանրաբեռնվածությունից ամբողջ աշխարհը»։
- Բեռի վերահսկումը 'backpressure, հերթեր, write-հետքերի բաժանումը։
- Համաձայնություն 'հստակ նշեք read-մոդելը (strong/eventae), իրադարձությունների կրկնապատկումը։
8) Կանարյան և անվտանգ դասավորություններ
Feature flags: Մենք կառավարում ենք միացումը առանց ռոտացիայի; կարող եք անջատել խնդրահարույց ֆունկցիոնալը։
Canary/Blue-Green: Մի մասը նոր տարբերակի վրա, SLI-ի համեմատությունը։ ավտոտկատը դեգրադացիայի ժամանակ։
Shadow traffic: Հարցումների կրկնօրինակումը նոր տարբերակով «չոր» պրոգոնի համար։
Schema-migr.ru: Երկաստիճան 'նախ ընդարձակել (backfill), ապա անցնել, ապա մաքրել։
9) Մոսկվա և DX (Developer Experience)
Մեկ պորտալ 'ինտերակտիվ կոմպոզիցիաներ, օրինակներ, MSK, Postman/Insomnia հավաքածուներ։- Changelog-ը և կարգավիճակ-էջը ՝ RFC/Webhook/փոստ փոփոխությունների և իրադարձությունների մասին։
- Guides-ը սխալներով 'քարտեզը' «reason _ code to ինչ անել հաճախորդին»։
- Կայուն sandbox/mock: տարբերակները, ֆիքսները, դեգրադացիաները (429/5xx), գործընկերների ավտոմեքենաների պայմանագրերը։
10) Անվտանգություն vs
Վավերացում 'կարճատև հոսանքներ, կոդավորման ռոտացիա առանց dountaima (JWKS, kid)։- Մուտքի իրավունքները ՝ RBAC/ABAC; քաղաքական գործիչը չպետք է կոտրի հաճախորդներին և կատարի «www.y-run» և տրամաբանեք մերժումները նախապես։
- Պաշտպանություն չարաշահումներից 'WAF, բոտ ֆիլտրեր, անոմալիաներ։ հստակ սխալ է և ոչ թե «նվազում»։
- PII-նվազեցումը 'լոգարաններում դիմակավորում, անանունիզացիայի կայուն սխեմաներ (որպեսզի վերլուծաբանը չփչանա)։
11) Պատասխաններ և սխալներ
Մեկ ձևաչափ
json
{ "error": { "code": "rate_limit", "message": "Too many requests", "retry_after_ms": 1200, "details": {...} } }
Կարգավիճակներ ՝ 2xx - հաջողություն; 4xx - հաճախորդի սխալը հստակ կոդով; 5xx-ը սերվերի խնդիր է (առանց մասերի արտահոսքի)։
Idempotent կարգավիճակները 'կրկնօրինակների համար վերադարձրեք աղբյուրի «resource _ id »/« transaction _ id»։
Սխալների տարբերությունը 'նոր «reason _ code» ավելացրեք առանց հին իմաստաբանության փոփոխության։
12) Հաճախակի սխալներ և ինչպես խուսափել դրանցից
Հանգիստ breaking-changes (դաշտի վերանվանումը/հեռացումը) հաճախորդների անկման նվազումը։ Լուծումը 'պայմանագրային թեստեր + սխեմաների ոսպնյակներ։
Վիրահատությունների պատահական կրկնօրինակները գետերի ժամանակ։ Լուծումը 'իդեմպոտենտ բանալիներ և արդյունքի տպագրություն։
P95-ի «փխրուն» պատասխանները մեծանում են։ Լուծումը 'պրոյեկտներ/« fields = »/կոմպակտ պարամետրեր, gzip/2019։
Կոշտ enum "-ը հաճախորդների մոտ նվազում է նոր արժեքներով։ Որոշումը '«ignore unknown» քաղաքականությունը։
Կոդավորման և հեռուստաչափության խառնուրդը կատարվում է ռուսական և խառնաշփոթ։ Լուծումը 'տարբեր ջրանցքներ/105։
Արտաքին կախվածության հրաժարվելու միասնական կետ։ Լուծումը 'քաշ, CB, ֆունկցիոնալ դեգրադացիա, timeouts։
13) API-ի կայունության մինի-չեկի թերթիկը
Պայմանագիրը և համատեղելիությունը
- OpenAPI/AsyncAPI որպես ճշմարտության միակ աղբյուրը
- Կոդավորման կանոնները և deprecation policy-ը մեկնաբանվում են
- Պայմանագրային թեստեր (Consumer-driven) CI-ում
Վստահություն և փետուր
- Idempotention write վիրահատություններ (բանալիներ, TTL, deduplication)
- Rate limiting, retry-policy հետ jitter, cursors pagination
- Circuit breaker/bulkhead, kash, timouts
Դիտարկումը
- SLI/SLO, error budget, alerts
- Treising-ը direlation id-ով, կառուցվածքային լոգներով
- Dashbords r95/r99/հաջողությունը էնդպոինտների և տարբերակների վրա։
Կպչուն
- Canary/Blue-Green, feature flags, ավտոտկատ
- Երկկողմանի սխեմաներ, shadow-traffic
- Պլանը և հետմորտը
DX և հաղորդակցություն
- System/MSK/հավաքածուներ, changelog, կարգավիճակ-էջ
- Կայուն sandbox և թեստային տվյալների շարք []
- Սխալները և առաջարկությունները «ինչ անել հաճախորդին»
14) Պաթոգենների կարճ օրինակներ
Idempotent
POST /payments
Idempotency-Key: u123 order456
→ 201 { "payment_id": "p789", "status": "pending" }
«payment _ id» -ի կրկնօրինակը '«p789», «status»: «pending»
Անվտանգ սխեմայի էվոլյուցիա
Քայլ 1: ավելացնել նոր դաշտ '«customer _ email» (optional)։
Քայլ 2 'սկսել այն լցնել սերվերի վրա։ հաճախորդները, ովքեր պատրաստ են, կարդում են։
Քայլ 3: հայտարարեք հին «email» ամսաթիվը։
Քայլ 4: N ամսվա ընթացքում 'թարգմանել «/v2 »և հեռացնել« email »միայն այնտեղ։
Retrai հետ ջիթթերի հետ
delay = base (2^attempt) + random(0, base)
API-ի իրականացումը կառավարվող ինժեներություն է 'պայմանագիր + համադրելիություն + չափելի նպատակներ + ածխաջրածինների կարգապահություն։ Թիմերը, որոնք ներկայացնում են SLO/սխալ բյուջեն, գաղափարախոսությունը, պայմանագրային թեստերը, դիտարկումը և կանարեյները, արտադրում են ֆունկցիոնալությունը ավելի արագ և անվտանգ, իսկ գործընկերները վստահում են նրանց։ Սա ուղղակի գումար է այսօր և վաղը կանխատեսելիությունը։