Կայունության փորձարկումը
1) Հիմնական հասկացությունները և նպատակները
Մոսկվան (reliability) հնարավորության հավանականությունն է։ կայունությունը (resilience) վարքագծն է ձախողումից հետո։
SLO/սխալ բյուջե 'դեգրադացիայի «ընդունակության» չափանիշներ։
Steady-state hypothesis: կայուն մետրիկի պաշտոնական սպասումը (օրինակ, p95 <200 ms, error rate <0։ 5%). Փորձը համարվում է հաջողակ, եթե հիպոթեզը պահպանված է։
Ձախողումների տեսակները ՝ ցանցային (լատենտ, կորուստ/դուբլի, բացթողումներ), հաշվարկային (CPU, հիշողություն), սթորիջը (I/O, սկավառակի սպառումը), կախվածությունը (5xx, timeouts, rate-limit), տրամաբանական (մասնակի միջադեպեր, "բժշկական դեգրադացիա"), վիրահատական (ռելիզացիա, դիֆերենցիալ), մուգ) "(split-brain, ժամացույցի հերթափոխեր)։
2) Կայունության բուրգը
1. Unit-թեստերը տրամաբանության (retrai, idempotenty, timauta)։
2. Fox-inject ադապտերների հետ (Testcontainers/tc-netem)։
3. Ինտեգրացիոն/ինտեգրված ցանցը/BD/cashams և real-world պրոֆիլներ։
4. Haos-փորձարկումները pre-2019-ում (հետո սահմանափակ վաճառքով) runbook 'am-ով։
5. Գեյմ դեյը թիմի բեմական ուսուցումներն են (մարդիկ + գործիքներ)։
3) Դիտարկումը որպես հիմք
SLI 'p50/p95/p99, error rate, saturation (CPU/heap/FD/IOPS), drop/timeout, queue depth։
Հետքերը '«նեղ տեղեր» գտնելու համար մերժման տակ։
Սեմանտիկ կայունության չափումները 'հաջողակ graceful-degrade, shed հարցումների մասնաբաժինը, ինքնազարգացման արագությունը (MTTR)։
Փորձարկումների մակնշումը '"chaos. experiment _ id ', «phant = inject/recover» իրադարձությունների/լոգարանների մեջ։
4) Մերժումների միգրացիայի կատալոգը (faul.ru)
Ցանցը 'ուշացում/ջիտթեր, կորուստ/կրկնօրինակներ/ռեդերինգ, աշխատանքային կարողությունների սահմանափակում, փաթեթային «փոթորիկներ», TIM բեկորներ։
Իսպանիան 'CPU սահմանափակումը, արտահոսքը/հիշողության լիմիտները, GC-ի դադարները, ձայնագրիչների սպառումը, «clock skew» -ը։
Պահեստը 'լատենտության աճը, EROFS, ENOSPC, կրկնապատկման դեգրադացիա, առաջնորդի կորուստ։
Կախվածություն ՝ 5xx/429, դանդաղեցում, ֆլամպինգ III, հնացած հավաստագրեր, rate-limit, «մասնակի պատասխաններ»։
Տվյալները 'ձայնագրման վնասվածքը, հոսքերի «աղեղները», իրադարձությունների կրկնությունը, տարբերակների հակամարտությունները։
Վիրահատությունները 'ձախողված թողարկումը, ֆիչի դրոշը, քրոնգ դրեյֆը, ձեռքի սխալը (սիմուլյացիայի մեջ)։
5) Կայունության պատրանքները (ինչ ստուգել)
Retrai ջիթերի և թայմաուտների հետ յուրաքանչյուր RPC-ում։
Circuit Breaker (բացահայտում/կիսագունդը, էքսպոնենցիալ վերականգնումը)։
Bulkheads (փամփուշտների/հերթերի մեկուսացում կրիտիկական օրինագծերի վրա)։
Load Shedding (նետում ենք ցածր պրիմիտիվ հարցումները հագուստի ժամանակ)։
Backpressure (ազդանշաններ վերևի շղթայի վրա, զուգահեռ լիմիտներ)։
Idempotency (idempotenty բանալիները «կողմնակի էֆեկտների» վրա)։
Կեշալիզացիան և ածխաջրածինները աղբյուրի քայքայման դեպքում։
Graceful Degradation (հեշտ պատասխաններ, stale տվյալները, ֆիչի անջատումը)։
Timeout-budget (ընդհանուր ժամանակը զանգերի շղթայի վրա)։
Ատոմականություն/փոխհատուցում (Saga/Disbox/Transactional Inbox)։
Քվորումները և կրկնօրինակումը (R/W քվորումները, կոնսիստենցիայի դեգրադացիան հասանելիության համար)։
Anti-entropy/reple (վերականգնումը իրադարձությունների «անցքերի» ժամանակ)։
6) Միգրացիայի և սպասումների բաղադրատոմսերը (կեղծ)
Ռետրեյը ջիթթերի և բրեյքերի հետ
for attempt in 1..N:
if breaker. open(): return fallback()
res = call(dep, timeout = base 0. 8)
if res. ok: return res sleep(exp_backoff(attempt) jitter(0. 5..1. 5))
if attempt == N: breaker. trip()
return fallback()
Շեյդինգը և բեքփրեշերը
if queue. depth() > HIGH cpu. load() > 0. 85:
if request. priority < HIGH: return 503_SHED limiter. acquire () # constrain concurrency
Idempotenty
key = hash("payout:"+external_id)
if store. exists(key): return store. get(key)
result = do_side_effect()
store. put(key, result, ttl=30d)
return result
7) Փորձարկումներ ՝ սցենարներ և վարկածներ
7. 1 «Պղնձի կախվածությունը»
Միգրացիա ՝ + 400 ms p95 արտաքին API-ի մոտ։
Սպասումը 'թայմաուտների աճը' X%, բրեյքերի հայտնաբերումը, fallback-պատասխանները, p99 մգ 7. 2 «Քեշի մասնակի կորուստ» Միգրացիա 'Redis/Kes-Shard հանգույցների 50 տոկոսը հրաժարվելը։ Սպասումը 'մեծացված miss, բայց առանց ավալանշի աղբյուրի (request coalescing/իմբուտաբելային TTL), ավտո-տաքացում և վերականգնում։ 7. 3 «Split-brain BD» Միգրացիան 'առաջնորդի կորցնելը, կրկնօրինակման անցումը։ Սպասումը 'կարճ deny ձայնագրություններ, կարդում ենք քվորումից, տվյալների կորստի բացակայությունը, Direbox-ը չի կորցնում հաղորդագրությունները։ 7. 4 «ENOSPC/սկավառակը լցված է» Միգրացիա 'սկավառակը 95-100 տոկոսով։ Սպասումը 'լոգարանների վթարային ռոտացիաները, ոչ արգելափակող փուչիկների մերժումը, քննադատական ամսագրերի պահպանումը (WAL), ալերտերը և ինքնանունը։ 7. 5 «Burst Express» Միգրացիա: 353 RPS տաք էնդպոինտին 10 ռուբլիա Սպասումը ցածր գերակայություն է, կայուն p95 «միջուկային» ճանապարհներ, սահմանների սահմաններում հերթերի աճը, DLQ փոթորիկների բացակայությունը։ 7. 6 «Clock Skew» Միգրացիա ՝ ժամանակի բարձրացումը +/242 ռուբլով Սպասումը 'ճիշտ TTL/ստորագրություն (leeeway), միապաղաղ թայմերներ գետերում, վալիդային հոսանքները թույլատրելի դրեյֆով։ 8) Փորձերի միջավայրը և անվտանգությունը Սկսեք pre-105-ից, սինթետիկ տվյալները, որոնք ամենամոտ են դելգայի/տեղաբանության երկարությանը։ Երկարության մեջ միայն վերահսկվող պատուհաններն են, ֆիչի դրոշները, շրջադարձային ամպլիտուդները, Auto-racat-ը, կարմիր կոճակը։ Guardrails: RPS/սխալների սահմանափակումներ, SLO-պաշտպաններ, կրիտիկական հանդիպումների ժամանակ օրինագծերի արգելափակում։ Պարտական է runbook-ին, թե ինչպես արձագանքել, ում զանգահարել, որտեղ դիտել։ 9) Ավտոմատիզացիա և CI/CD Փորձարկումների կատալոգը որպես կոդ (YAML/DSL) 'նպատակներ, ներարկումներ, մետրեր, շեմեր, «կոճակներ»։ Smoke-chaos-ը յուրաքանչյուր ենթախմբում 'կարճ ներարկումներ (օրինակ, 2 րոպե + 200 ms կախվածության) սթեյջում։ Մատրիցայի գիշերային պրոգրեսները 'ծառայությունները մերժման տեսակներ են։ Թողարկման գեյթ 'արգելք, եթե դիմադրությունը ցածր է շեմից (օրինակ ՝ «fallback coverage <95%» «դանդաղ կախվածության տակ»)։ 10) Տվյալները և կոնսիստենտալությունը Ստուգեք փոխհատուցումը (Saga), մասամբ կատարված վիրահատությունները պետք է հասնեն համաձայնեցված վիճակի։ Փորձարկեք իրադարձությունների կրկնությունները/դուբլները, out-of-order առաքումը, «անցքերը» և ծալքերը։ Ստուգեք տիրույթի ինվարանտները ձախողումներից հետո 'հավասարակշռությունը բացասական չէ, գործարքները չեն կրակում ", սահմանները չեն խախտվում։ 11) Anti-patterna Փորձարկել միայն happy-path և բեռը առանց ձախողումների։ Առանց ջիթերի Ռետրայի փոթորիկը քայքայվում է։ Համաշխարհային թայմաութ բյուջեի բացակայությունը բացատրում է կասկադային թայմաուտները։ Բոլոր խնդիրների համար միասնական փամփուշտը բացատրվում է մեկուսացման բացակայությամբ (bulkheads)։ «Անվերջ» հերթերը բացատրում են լատենտության/OOM աճը։ Փորձերի զրոյական հեռուստաչափությունը բացատրում է «կույր» քաոս-պրակտիկան։ Հաոսը վաճառում է առանց պատասխան/լիմիտներ/պատասխանատու սեփականատեր։ 12) Ճարտարապետի չեկի թերթիկը 1. Որոշված է steady-state վարկածը և SLO-ն։ 2. Յուրաքանչյուր RPC-ում կան թայմաուտներ, ռետտա ջիթերի, բրեյքերների հետ։ 3. Իրականացվել են bulkheads, limiters, backpressure, load-shedding? 4. Քեշը 'coalescing, պաշտպանություն քեշի փոթորիկներից, տաքացնելով։ 5. Delbox/Saga կողմնակի էֆեկտների համար, idempotent բանալիներ։ 6. Քվորումները/կրկնօրինակումը/ֆեյլովերը փորձարկվել են։ 7. Կա փորձարկումների կատալոգ, nightly քաոս և խաղեր CI/CD-ում։ 8. Մետրիկները/հետքերը նշում են փորձարկումները, կան դաշբորդեր։ 9. Runbook "և" կարմիր կոճակը "պատրաստ են, պատասխանատվությունը նշանակված է։ 10. Dev/MSE/Supert-ի մասնակցությամբ։ 13) Մինի գործիքները և ոճերի օրինակները (YAML-sketchi) Ցանցը (tc/netem) Կայունության փորձարկումը ոչ թե «քաոսի հնարք» է, այլ մի առարկա, որը կանխատեսելի համակարգ է դարձնում ձախողումների տակ։ Պարզ վարկածները, հեռուստացույցները, կառավարվող փորձարկումների կատալոգը և ներկառուցված պաթերտայի ճարտարապետությունը (թայմաուտներ, բրեյքերներ, մեկուսացում, դիցիցիտացիա) վերածում են պոտենցիալ պատահարների վերահսկվող սցենարների։ Թիմը վստահություն է ստանում, իսկ օգտագործողները կայուն ծառայություն են նույնիսկ ձախողումների պայմաններում։yaml experiment: add-latency target: svc:payments inject:
netem:
delay_ms: 300 jitter_ms: 50 loss: 2%
duration: 10m guardrails:
error_rate: "< 1%"
p95_latency: "< 400ms"CPU/Heap
yaml inject:
cpu_burn: { cores: 2, duration: 5m }
heap_fill: { mb: 512 }Կախվածությունը
yaml inject:
dependency:
name: currency-api mode: slow p95_add_ms: 500 fallback_expectation: "serve stale rates ≤ 15m old"Եզրակացություն