Exactly-once սեմանտիկա
Ի՞ նչ է exactly-once իրականում իրականում
«Exactly-once» -ի տակ հաճախ հասկանում են երկու տարբեր բաներ
Առաքում 'հաղորդագրությունը կփոխանցվի սպառողին հենց մեկ անգամ։
Վերամշակումը 'վերջնական կողմնակի էֆեկտը (ձայնագրությունը BD-ում, հավասարակշռության փոփոխությունը, այլ իրադարձության արտանետումը) տեղի կունենա հենց մեկ անգամ, նույնիսկ եթե առաքումը կամ փորձերը ավելի մեծ էին։
Բաշխված համակարգերում ավելի հուսալի է խոսել վերամշակման սեմանտիկայի մասին։ Առաքումը միայն մեկ անգամ դժվար է ապահովել (կրկնօրինակները և կրկնությունները անխուսափելի են), բայց դուք կարող եք անել այնպես, որ վերջնական վիճակը համարժեք լինի միակ վերամշակմանը։
Երբ EOS-ը կարիք ունի, իսկ երբ չկա
Պահանջվում է EOS, եթե
Դրամական գործարքները և հավասարակշռությունները 'երկակի մարումը անընդունելի է։
Windows/քվոտ, բիլինգային հաշվիչներ։
Անխուսափելի արտաքին մարտահրավերները (օրինակ, բանալիների միակ ակտիվացումը)։
Դուք կարող եք անել at-leport-once + idempotent, եթե
Ալիքի էֆեկտները կամ փոխհատուցումները (սագներ, բարձրացումներ)։
Թույլատրվում են ժամանակավոր կրկնօրինակներ վիտրիններում/լոգարաններում։
Ավելի էժան է գաղափարական sink ապահովել, քան ծախսել գործարքները ամբողջ թատերախմբի միջոցով։
Մոդել ՝ end-to-end vs. hop-by-hop
Hop-by-hop EOS: Յուրաքանչյուր հատվածը (ռուսական պրոցեսորի աղբյուրը կարգավորող ընդունիչ) երաշխավորում է, որ իր գործողությունը կիրառվի հենց մեկ անգամ։
End-to-end EOS-ը, ամբողջ շղթան երաշխավորում է, որ «փաստից» մինչև «sida էֆեկտը» արդյունքը համարժեք է միակ վերամշակմանը։
Պրակտիկայում end-to-end-ը հասնում է գործարքների համադրություն և/կամ idempotenty յուրաքանչյուր հոփում։
Հիմնական կառուցվածքային բլոկները
1. Idempotent վիրահատություններ
Վիրահատության բանալին նույն հարցման խոհարարը նույն արդյունքն է տալիս։
Ключи: `idempotency_key`/`event_id`/`operation_id`.
Տե՛ ս ՝ TTL-ի հետ «տեսանելի» վիրահատությունների իրականացումը։
2. Գործարքները «կարդում եմ-գրում» (read-process-write)
Մեկ ատոմային միավորում աշխատանքը գրանցվում է նաև կողմնակի ազդեցություն, և կարդալու առաջընթաց (օֆսետներ/դիրք)։ Սա վերացնում է «ուրվագծերը» քայլերի միջև ընկնելիս։
3. Տարբերակումը/SEQUENCE
Ագրեգատի համար պահպանվում է տարբերակը/հաշվիչը; փոփոխությունները օգտագործվում են միայն եթե «expected _ version» համընկնում է։ Նույն իրադարձության կրկնությունները չեն բարձրացնում ռուսական էֆեկտը մեկ անգամ։
4. Դեդուպլիկացիա
Ինդեքսը «(consumer _ id, event _ id)» կամ բնական «business _ id» վիրահատությամբ։
Իրականացման արտոնագրեր
1) Գործարքային լոգ + գործարքային sink 'օֆսետի ամրագրմամբ։
Հիանալի է հոսանքի պրոցեսինգի համար։
Մենք կարդում ենք լոգարանից (միայն հաստատված գրառումները)։
Մենք վերամշակում ենք։
Մեկ գործարքում
a) արձանագրում ենք sink էֆեկտը (BD/աղյուսակ),
b) մենք արձանագրում ենք «կարդացված է մինչև N օֆսեթ» (նույն BD)։
Կոմունիտը։ Restart-ում կամ ամեն ինչ փակված է (և օֆսեթը կփոխվի), կամ ոչինչ։
Հատկություններ 'կրկնվող կատարումը չի վնասում։ «Ուղիղ մեկ անգամ» էֆեկտով, նույնիսկ եթե հաղորդագրությունը երկու անգամ կարդար։
2) Dibox + idempotent condumer
Գործարքային արտադրողների ծառայությունների համար։
Մեկ BD գործարքում, մենք փոխում ենք հիբրիդային ձայնագրությունը և գրում ենք իրադարձությունը www.box-ում։
Ռեպլեկտորը իրադարձություն է բերում նույն «event _ id» -ի հետ։
Կոնսուումերները օգտագործում են իրադարձություններ idempotent (dedup 'event _ id')։
Հատկությունները 'արտադրողը երաշխավորում է, որ փաստը չի կորցնի։ վահանակները երաշխավորում են հենց մեկ ազդեցություն։
3) EOS-ը Kafka/Flink նման համակարգերում (հայեցակարգային)
Idempotent արտադրողը 'պաշտպանում է դուբլներից ուղարկման ցանցերում։
Արտադրողի գործարքները 'մի խումբ գրառումներ տոպիկի մեջ + կոնսուումերի տեղաշարժը ատոմային է։ ընթերցողները օգտագործում են «read _ committed» մեկուսացումը։
Պրոցեսինգի կողմը պահպանում է վիճակը (state store) և այն հայտարարում է գործարքի հետ։
Հատկությունները 'սթորի/տասկի կրկնվող արձակումը չի հանգեցնում կրկնակի էֆեկտին։ կրկնօրինակները «տեսանելի չեն» downstream։
4) Idempotent «siks» (sinks) ups.ru/merge միջոցով։
Sink ընդունում է "operation _ id "/" event _ id" և կատարում է "UPSS.RU... WHERE NOT EXISTS`.
Կողմնակի էֆեկտը (օրինակ, հաշվարկումը) կատարվում է ատոմային ստուգմամբ «արդյո՞ ք արդեն օգտագործվել է»։
Հատկությունները 'EOS-ի էժան մեթոդը պահեստավորման սահմանին, առանց բաշխված գործարքների։
Իրականացման հիմնական մանրամասները
Գործողության անջատիչները
Մենք պետք է դետերմինացված լինենք խոհարարների համար (մի ստեղծեք նոր UUID ռետրոյի ժամանակ)։
Ունենալ կայուն տեսանելիության տարածք (վահանակի/միավորի/համակարգի վրա)։
Dive dedupliation
Колонки: `consumer_id`, `operation_id`, `applied_at`, `ttl_expires_at`.
Ինդեքսները '(consumer _ id, operation _ id)'։
TTL-ը բացատրում է կրկնօրինակների առավելագույն պատուհանը (լոգոյի վերականգնումը + պոտենցիալ ուշացումները)։
Լավատես մրցակցություն
Write-մոդելում պահեք ագրեգատի տարբերակը։
Իրադարձություն/հրամաններ օգտագործելիս օգտագործեք «WHMS version =: expected»; կրկնօրինակը չի ավելացնի տարբերակը։
Պատվեր/կարգ
EOS-ը հավասար չէ նույն կարգին։ Ապահովեք կոնսիստենցիան կուսակցության ստեղնի միջոցով (ագրեգատի բոլոր իրադարձությունները մեկ կուսակցություն են) և/կամ համեմատություն 'sequence>։
Idempotent արտաքին մարտահրավերները
Անապահով մեթոդների համար (օրինակ, HTTP-webhuks երրորդ կողմի ծառայության մեջ) ավելացրեք «Idempotency-Key» և պահանջեք, որ գործընկերն աջակցի նրան։
Հաճախակի թակարդներ
EOS-ը միայն մեկ վայրում է 'եթե sink idempotenten է, բայց դուք կարգավորում եք հիբրիդային իրադարձությունները առանց կուռքի, կստանաք downstream։
Երկու համայնքներ 'սկզբում BD-ում, ապա օֆսեթը բրոկերում, նրանց միջև անկումը ստեղծում է էֆեկտների կրկնօրինակներ։
Հում CDC-ն դուրս է գալիս 'BD-ի սխեմայի փոփոխությունը կոտրում է սպառողների կուռքերը։
Անկայուն բանալիներ ՝ «operation _ id» կախված է ժամանակի/ռանդոմից և փոխվում է ռետրատի ժամանակ։
Արժեքը և փոխզիջումները
Լատինականությունը ՝ գործարքներ/մեկուսացված ընթերցումներ, բացատրում է p95/p99 աճը։
Պահեստավորման հովիվ 'սննդի սեղաններ, state stores, գործարքների լույսեր։
Գործողության բարդությունը 'գործարքների թայմաուտները, հոսքերի ռեբալանսը, «ծածկված» նստաշրջանները։
Ախտորոշումը 'ավելի շատ վիճակներ («kaite», «երևում է որպես read _ committed», «արձագանքեց»)։
Ընտրեք EOS կետերը 'կրիտիկական ագրեգատների և էֆեկտների համար։ մնացած մասը ծածկեք կուռքերի և փոխհատուցումների միջոցով։
Փորձարկումը exactly-once
1. Fox-inject-ը 'քայլերի միջև գործընթացի նվազումը «գրեց էֆեկտը» և «ձայնագրեց օֆսետը»։
2. Կրկնօրինակներ 'նույն հաղորդագրությունը 2-5 անգամ, համոզվեք մեկ էֆեկտի մեջ։
3. Restarts-ը և rebalans-ը 'կանգառը/վերագործարկումը, կրկնակի վերամշակման բացակայությունը։
4. Ցանցային ֆլամպին 'թայմաուտները գործարքի կեսին, համայնքի խոհարար։
5. Բեռի թեստերը 'հերթերի աճը, թե արդյոք դեգրադացիա չկա մինչև «ընդմիշտ գործարքում»։
Մինի ձևանմուշներ (կեղծ)
Idempotent sink-ը օֆսետի ֆիքսումով
pseudo begin tx if not exists(select 1 from dedup where consumer_id=:c and op_id=:id)
then apply_effect(...) -- upsert / merge / add_one_time_action insert into dedup(c, id, applied_at) values(:c,:id, now)
end if update offsets set pos=:pos where consumer_id=:c commit
Թիմը ագրեգատի տարբերակով
pseudo begin tx update account set balance = balance +:delta,
version = version + 1 where id=:account_id and version=:expected_version;
if row_count=0 then error CONCURRENT_MODIFICATION commit
Անվտանգություն և ընկերակցություն
PII/PCI-ը դեդուպի գյուղերում, առնվազն պահեք, օգտագործեք «հում» տվյալների փոխարեն։
Աուդիտ 'լոգո _ operation _ id', «trace _ id», արդյունքը (APLIED/ALREADY _ APPIED)։
Պահեստավորման քաղաքականությունը 'TTL-ը Dedup-Masters-ում, օֆսեթների/logs արխիվացումը։
Anti-patternes
«Իրական exactly-once առաքում» 'փորձելով բացառել կրկնությունները տրանսպորտային արձանագրության մակարդակում առանց էֆեկտիվության։
Գլոբալ բաշխված գործարքները ամեն ինչի վրա 'XA/2PC բոլոր ծառայությունների միջոցով' փխրուն և դանդաղ։
Ոչ ստանդարտ ծեծերի խառնուրդը (օրինակ, e-mail ուղարկվել է օֆսետի համայնքին)։
Ռուսական վիրահատության բացակայությունը 'վստահությունը բեռի «եզակի» վրա։
Chek-Lister վաճառվել է
- Յուրաքանչյուր կրիտիկական էֆեկտի վրա կա գաղափարական բանալին։
- Ofset/ընթերցանության դիրքը գրանցվում է մեկ գործարքում էֆեկտով։
- Դեդուպի աղյուսակները ինդեքսավորված են. TTL-ը բացատրում է լոգոյի վերականգնումը։
- Ագրեգատների համար ներառում է լավատեսական մրցակցություն (տարբերակը/sequence)։
- Հոսքերը/տոպիկները կարդում են «միայն մաքրված» ռեժիմում (եթե հասանելի է)։
- Կրկնօրինակների և անկումների թեստերը ներկա են CI/CD-ում։
- Dashbords 'բաժանարարների, անհաջող գործարքների, արգելափակումների, ճամբարների մի մասը։
- «Idempotency-Keu »//timautam ինտեգրատորների համար։
FAQ
Կարո՞ ղ եք ապահովել EOS առանց գործարքների։
Հաճախ այո 'sink' s (ups.ru/merge) և ագրեգատների տարբերակման միջոցով։ Գործարքները պարզեցնում են երաշխիքները, բայց բարձրացնում են արժեքը։
Արդյո՞ ք անհրաժեշտ է «exactly-once» բոլորին։
Ոչ։ Նա թանկ է։ Օգտագործեք այն կետերը, որտեղ փոխհատուցումը հնարավոր չէ/ճանապարհ։
Ինչպե՞ ս կապել նամակները/webhuks EOS-ի հետ։
Ծանուցում ուղարկեք կոմունիտին, ուղարկեք էֆեկտը շտկելուց հետո։ պահեք «notifice _ id» և ուղարկեք idempotent։
Ի՞ նչն է ավելի կարևոր ՝ առաքում կամ վերամշակում։
Մշակումը։ Առաքումները կարող են կրկնվել։ վերջնական վիճակը պետք է լինի ճիշտ և միակը։
Արդյունքը
Exactly-once-ը ազդեցության ճկունության մասին է, ոչ թե լարման մեջ դուբլի բացակայության մասին։ Այն հասնում է գաղափարախոսության, էֆեկտի ատոմային ամրագրման և կարդալու առաջընթացի, խելացի կուսակցության և տարբերակման կարգապահության համադրությանը։ Օգտագործեք EOS-ը այնտեղ, որտեղ սխալների արժեքը անընդունելի է, և ստուգեք դրա իրականությունը անկման և կաղնու փորձարկումներով, ոչ թե տրանսպորտում։