GH GambleHub

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 ռետրոյի ժամանակ)։

Ունենալ կայուն տեսանելիության տարածք (վահանակի/միավորի/համակարգի վրա)։

Dedupliations

Ինդեքսները '(consumer _ id, operation _ id)'։

Колонки: `consumer_id`, `operation_id`, `applied_at`, `ttl_expires_at`.

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-patterns

«Իրական exactly-once առաքում» 'փորձելով բացառել կրկնությունները տրանսպորտային արձանագրության մակարդակում առանց էֆեկտիվության։

Գլոբալ բաշխված գործարքները ամեն ինչի վրա 'XA/2PC բոլոր ծառայությունների միջոցով' փխրուն և դանդաղ։

Ոչ ստանդարտ ծեծերի խառնուրդը (օրինակ, e-mail ուղարկվել է օֆսետի համայնքին)։

Ռուսական վիրահատության բացակայությունը 'վստահությունը բեռի «եզակի» վրա։


Chek-թերթ վաճառվել

  • Յուրաքանչյուր կրիտիկական էֆեկտի վրա կա գաղափարական բանալին։
  • 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-ը այնտեղ, որտեղ սխալների արժեքը անընդունելի է, և ստուգեք դրա իրականությունը անկման և կաղնու փորձարկումներով, ոչ թե տրանսպորտում։

Contact

Կապ հաստատեք մեզ հետ

Կապ հաստատեք մեզ հետ ցանկացած հարցի կամ աջակցության համար։Մենք միշտ պատրաստ ենք օգնել։

Սկսել ինտեգրացիան

Email-ը՝ պարտադիր է։ Telegram կամ WhatsApp — ըստ ցանկության։

Ձեր անունը ըստ ցանկության
Email ըստ ցանկության
Թեմա ըստ ցանկության
Նամակի բովանդակություն ըստ ցանկության
Telegram ըստ ցանկության
@
Եթե նշեք Telegram — մենք կպատասխանենք նաև այնտեղ՝ Email-ի дополнение-ով։
WhatsApp ըստ ցանկության
Ձևաչափ՝ երկրի կոդ և համար (օրինակ՝ +374XXXXXXXXX)։

Սեղմելով կոճակը՝ դուք համաձայնում եք տվյալների մշակման հետ։