Հինգ քննադատական սխալներ API-ը գործարկելիս
Սխալ թիվ 1։ Ոչ մի իդեմպոտենտություն և «փոթորիկ» գետերի
Ախտանիշները 'պատվերների/վճարումների կրկնապատկումը, գումարների անհամապատասխանությունը, վիճահարույց բարձրացումները, DLQ-ի ալերտները մեծանում են։
Արմատն այն է, որ հարցումների/webhuks-ի և ցանցային ֆլամպերի կրկնվող առաքումը նորմալ է։ Եթե վիրահատությունը «ստեղծել/դուրս հանել» չի, ռետրոյները մեծացնում են վնասը։
Ինչպես ճիշտ
Idempotency-Key/« operation _ id »-ը բոլոր անապահով մեթոդների վրա (POST/PATCH)։- Յուրահատուկ ինդեքսը BD-ում 'operation _ id "։ Խոհարար, վերադարձրեք վերջին արդյունքը։
- Webhuks Inbox-աղյուսակի միջոցով (dedube 'event _ id + signature ")։ Ելքային իրադարձությունները Medibox-ն են։
- Retrai 'առավելագույնը 1-2 անգամ, էքսպոնենտը + ջիտթեր, միայն անվտանգ վիրահատությունների համար։
HTTP-2019 (օրինակ)։
http
POST /v1/payments
Idempotency-Key: ik_f35a2
Content-Type: application/json
{"amount": 5000, "currency": "EUR", "source": "card_..."}SQL-պաշտպանություն (պարզեցված)
sql
ALTER TABLE payments ADD CONSTRAINT uniq_op UNIQUE (operation_id);Retrai ջիթերի հետ (կեղծ)
python for i in range(2):
try: return call_api(payload, timeout=0. 6)
except Timeout:
sleep(0. 05 2i + random. uniform(0, 0. 05))
raise UpstreamUnavailableՉեկ-թերթ
- Ամբողջ «դրամական/ստեղծող» տրամաբանությունը ունի «operation _ id» և uniq ինդեքսը։
- Webhuks-ը միայն Inbox-ի միջոցով է 'idempotent worker-ով։
- Հաճախորդ MSK ինքնաբերաբար տեղադրում է Idempotency-Key-ը։
Սխալ թիվ 2։ Tim-uta/retrai դեմ SLO: «վերագտնելով» կախվածությունը
Ախտանիշները ՝ p95 հանկարծակի վճարում է, հերթերը աճում են, circuit breaker «celaker» -ը։
Արմատն այն է, որ ընդհանուր SLO պատասխանը 400-600 մզ է, իսկ Time-uta դեպի արտաքին API-ը ՝ 1-2 վրկ, իսկ ևս 363 գետերը։ Դուք ավելի երկար եք անում, քան կարող եք, և հարձակվում եք կախվածությունը պատմիչների հետ։
Ինչպես ճիշտ
Budget-timing: եթե SLO 400 ms, upstream-time-aut: 250-300 ms; ընդհանուր Time-out հարցումը sLO-ն է։
Limits/Backpressure: սեմաֆորներ/worker-pool յուրաքանչյուր կախվածության զանգերի համար։ Լի է 429/503 անմիջապես։
Circuit breaker: «Open» թայմ-աուտներում/5hx, «half-open»։
Admission nol: Սահմանափակեք զուգահեռ (հոսքի վրա, endpoint/PSA)։
Օրինակ (Go)
go sem: = make (chan struct +, 64 )//մրցակցության սահմանափակում PMS func callPSA (ctx dext)։ Context, req Req) (Res, error) {
select {
case sem <- struct{}{}:
defer func(){ <-sem }()
c, cancel:= context. WithTimeout(ctx, 300time. Millisecond)
defer cancel()
return psp. Do(c, req)
default:
return Res + com, ErrBusy//չարտոնված մերժումը հերթի փոխարեն առանց վերջի
}
}Չեկ-թերթ
- Թայմ-աուտները SLO-ից կարճ են; trai 242; կա ջիթեր։
- Պուլա/սեմաֆորներ արտաքին API-ի վրա; circuit breaker մետրերով։
- Մենք վերադառնում ենք 429/Retry-After, ոչ թե կապեր։
Թիվ 3 սխալը։ Թույլ անվտանգություն 'վեբհուկի ստորագրություններ, գաղտնիքներ, TLS
Ախտանիշները '«օտար» վեբհուկները անցնում են, գաղտնիքները կոդում/լոգում, MITM ռիսկերը։- Արմատն այն է, որ ստորագրության/թարմության ստուգում չկա, գաղտնիքները ապրում են env ֆայլերում, հին TMS-ում և թույլ վերնագրերում։
Ինչպես ճիշտ
Webhuks HMAC-SHA256 + «X-Timestamp» (պատուհանը 5-10 րոպե), ստորագրության խիստ համեմատություն։
MTIM-ը կրիտիկական ինտեգրման կամ IP allow-list-ի համար։- Գաղտնիքների վերացումը Vox/Cloud KSA-ի միջոցով։ նվազագույն իրավունքներ; ընթերցման աուդիտ։
- TLS 1. 2/1. 3 only, HSTS, ճիշտ SNS (աղբյուրների նեղ ցուցակը)։
Ստորագրության ստուգումը (Python)
python def verify(sig_hdr, ts_hdr, body, secret):
if abs(time. time() - int(ts_hdr)) > 600: raise Expired()
calc = hmac. new(secret, (ts_hdr + "." + body). encode(), hashlib. sha256). hexdigest()
if not hmac. compare_digest(calc, sig_hdr): raise BadSig()Չեկ-թերթ
- Բոլոր Webhuks ստորագրվում և ստուգվում են. թարմության պատուհանը սահմանափակ է։
- Գաղտնիքները KFC/Vox-ում, կան ռոտացիա և աուդիտ։
- TFC/HSTS-ն ներառում է; MSS կետային; IP/mTSA որտեղ տեղին է։
Թիվ 4 սխալը։ Պայմանագիր-դրիֆթ 'սխեման «ապրում էր իր կյանքը»
Ախտանիշները ՝ «միայն հաճախորդների մի մասում», 500/422 լոգարանում, RPK և API տարբեր տարբերակները վիճում են։
Արմատն այն է, որ չկան խիստ նկարագրություններ, որոնք անհամատեղելի են, «հանգիստ» դաշտեր, տարբեր անվանումներ։
Ինչպես ճիշտ
Առաջին պայմանագիրը 'OpenAPI/AsyncAPI + ռուսական/հաճախորդների արտադրություն; իրադարձությունների համար 'Avro/Delobuf + Schema Registry։
Տարբերակումը '«v1 71 v2» (URI/heder), deprecation պլանը, grace ժամանակահատվածը։
Backward-compat: միայն Minorive-ում փոփոխություններն են։ հեռացնել/վերանվանել առանց v-bump։
Պայմանագրային թեստերը ՝ Pact/Buf - պրովայդեր/հյուպատոսներ ստուգվում են CI-ում։
Օրինակներ
yaml
OpenAPI 'գումարի հստակ տեսակը amount _ minor-ում։
Type: integer minimum: 0 description: Գումարի նվազագույն միավորներում (ամբողջ)Չեկ-թերթ
- Պայմանագրերը պահվում են git-ում, CI-ն վալիդացնում է/կոտրում է անհամատեղելիության դեպքում։
- Սխեմաների գրանցումը իրադարձությունների համար, «back/forward» համատեղելիությունը։
- Փոփոխական էջ, բաժանման ամսաթվերը, գործընկերների համար թեստային պատը։
Թիվ 5 սխալը։ «Կույր» գործարկումը 'ոչ մի մետրիկ/logs/treiss և ավազաքարեր
Ախտանիշները. <<ոչինչ չի երևում>>, աջակցությունը փչացնում է, դեբեկտը 'ձեռքերը։
Արմատն այն է, որ դիտարկումը չի ներառվել, սինթետիկ չկա, ավազը «բառերով» է։
Ինչպես ճիշտ
RED/USE-metrics: rate/error/latency յուրաքանչյուր endpoint, երթուղիներով/։
Հարաբերակցությունը '«trace _ id» բոլոր լոգարաններում և պատասխաններում։ ww.ebhuk հարցումը։- Սինթետիկ 'health-թեստեր (login/deposit-երգ), SLA-24T + 60 webhuks համար։
- Ավազը/սթեյջը 'ամբողջովին մեկուսացված բանալիներ/ֆորումներ, ֆիկտիվ PSA, ձայնագրությունները «չեն ընկնում զեկույցներում»։
Պատասխանը trace-բաղադրիչի հետ
http
HTTP/1. 1 202 Accepted
Trace-Id: 7f2b3d8e9c1a4
Location: /v1/ops/req_42/statusՉեկ-թերթ
- Metriki RED/USE, dashbords, alerts (ախտանիշներ + պատճառները)։
- end-to-end treiss; JSON լոգները, առանց PII, «trace _ id»։
- Սինթեզիկան հիմնական տարածաշրջաններից. ավազը պարտադիր է, բանալիները տարբեր են։
Prelaunch պլանը (T-7 no T-0)
T-7 օր
Վերջնական պայմանագիրը սկանը 'արդյոք անհամատեղելի փոփոխություններ չկան։ freeze սխեմաներ։- Գաղտնիքները/հավաստագրերը 'համապատասխան ռոտացիա, հասանելի, KHL քաղաքականություն։
- Սինթետիկ 24-7, ալերտները կապված են on-call-ի հետ։
T-3 օր
Բեռի մինի-պրոգոնը (burst 2-5 րոպե) 'r95/pula/հերթեր կանաչ գոտում։
DRY-RUN Webhukov (կրկնություններ, 5xx, ջիտթեր), DLQ ստուգում։
Գործընկերների «Հեռախոսների գիրքը» ՝ L1/L2 կապ, war-room ջրանցք։
T-0:- Կանարեցող 355 տոկոսը 25 տոկոսն էր SLO գեյշների 50 տոկոսը։ պատրաստ է rollback.
- Ներառված են kill-switch/feature-flags ռիսկային ֆիգուրների վրա։
- War-room-ը ակտիվ է, կոդավորման ձևանմուշների կարգավիճակը։
Rollbek պլանը (եթե ինչ-որ բան սխալ էր)
1. Հեռացնել մուտքը նախորդ կայուն տարբերակով/երթուղով։
2. Անջատել ֆիչեֆլագը հակասական փոփոխությունները։
3. Կայունացնել հերթերը/փամփուշտները, կանգնեցնել հոսանքները փոթորկի ժամանակ։
4. Փոստի դեպքը 'հավաքել թայմլինը, արմատները, առաջադրանքները (ֆիքս ֆորվարդը/պայմանագրի ֆիքսները)։
Ինքնաքննություն սկսելու համար (կարճ)
Հաճախ տրվող «և ինչպես լինել, եթե...»
... պրովայդերը չի աջակցում Idempotency-Key-ին։- Պահեք «hash (body)» + «partner _ request _ id» և ներկայացրեք ձեր կուռքերը։
- Փակեք «operation _ id» և ժամանակավորապես պահեք «unknown medreconcile» կարգավիճակը։ պարբերական reconciler-ը կփակի տարբերությունները։
- Տարբերեք endpoint 's («/v1 »և «/v2»), ուղարկեք վերնագիր/URI, պահեք առնվազն N ամիս backward համատեղելիությունը։
Ռեզյումե
Ինտեգրման ձախողումները գրեթե միշտ էլ նույն բանն են. Ոչ մի գաղափարախոսություն, սխալ թայմ-աուտներ և ռետրան, վեբհուկի թույլ ստորագրությունը, դրաֆը և տեսանելիության բացակայությունը։ Նախօրոք տեղադրեք պայմանագրերը, միացրեք դիտարկումը, տեղադրեք սահմանաչափեր/բեքսպրեսթեր, ստորագրեք բոլոր արտաքին փոխազդեցությունները և սինթեզիկան։ Նույնիսկ երբ ձեր գործընկերները ձախողվում են, ձեր թողարկումը կմնա կառավարվող 'առանց այն փողի, որ կորցրել են գետերում, և առանց գիշերվա ամբողջ թիմում։
