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

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

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

Contact

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

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

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

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

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

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