GH GambleHub

Exactly-once vs At-least-once

1) Ինչո՞ ւ ընդհանուր առմամբ քննարկել սեմանտիկները

Առաքման սեմանտիկան որոշում է, թե ինչպես հաճախ ստացողը կտեսնի հաղորդագրությունը ձախողումների և գետերի ժամանակ

At-most-once-ը առանց խոհարարների, բայց հնարավոր է կորուստ (հազվադեպ ընդունելի)։

At-least-once-ը չի կորցնում, բայց հնարավոր են կրկնօրինակներ (բրոքերների մեծամասնության դեֆոլտ/հերթեր)։

Exactly-once-ը, յուրաքանչյուր հաղորդագրություն մշակվում է հենց մեկ անգամ դիտարկվող էֆեկտի տեսանկյունից։

Հիմնական ճշմարտությունը 'աշխարհում բաշխված առանց գլոբալ գործարքների և սինխրոն ինտեգրման «մաքուր» end-to-end exactly-once-ը անհասանելի է։ Մենք կառուցում ենք արդյունավետ exactly-once 'թույլ ենք տալիս կրկնություններ տրանսպորտի վրա, բայց վերամշակում ենք idempotent այնպես, որ դիտարկվող էֆեկտը լինի «կարծես մեկ անգամ»։


2) Մերժումների մոդելը և որտեղ են առաջանում կրկնօրինակները

Կրկնությունները հայտնվում են պատճառով

Ack/commit (արտադրողը/brocer/կոնսումերը «չլսեցին» ապացույց)։

Առաջնորդների/կրկնօրինակների վերընտրությունները, ցանցային բացումից հետո վերականգնումները։

Timautov/retov ցանկացած հատվածներում (հաճախորդը brocker wwww.ink)։

Հետևանքը 'դուք չեք կարող ապավինել տրանսպորտի «առաքման եզակիությանը»։ Մենք կառավարում ենք էֆեկտները 'ձայնագրությունը BD-ում, փողի մարումը, նամակներ ուղարկելը և այլն։


3) Exactly-once-ը մատակարարների մեջ, և ի՞ նչ է իրականում իրականում։

3. 1 Kafka

Տալիս է աղյուսներ

Idempotent Producer (`enable. idempotence = 105 ") - կանխում է արտադրողի կողքը ռելսերի ժամանակ։

Գործարքները, ատոմորեն, հրապարակում են հաղորդագրությունները մի քանի կուսակցություններում և հայտարարում են սպառման օֆսեթներ (patter read-process-write առանց «բացթողումների»)։

Compaction-ը պահպանում է վերջին կարևորությունը բանալին։

Բայց «շղթայի վերջը» (սինկ ՝ BD/112/փոստ) դեռ պահանջում է կուռք։ Հակառակ դեպքում, վերամշակողի դուբլը կհանգեցնի էֆեկտի դուբլի։

3. 2 NATS / Rabbit / SQS

Լռելյայն 'at-lement-once' ack/redelivery։ Exactly-once-ը հասնում է ծրագրի մակարդակում 'բանալիներ, dedup-stor, ups.ru։

Եզրակացությունը 'Exactly-once տրանսպորտը exactly-once ազդեցություն ունի։ Վերջինը կատարվում է վերամշակման մեջ։


4) Ինչպե՞ ս կառուցել արդյունավետ exactly-once at-leport-once վերևում։

4. 1 Idempotent բանալին (idempotency key)

Յուրաքանչյուր թիմ/իրադարձություն բնական բանալին է '«payme _ id», «order _ id # step», «saga _ id # n»։ Վերամշակող

Ստուգում է «արդեն տեսել»։ - dedup-store (Redis/BD) TTL/retenshn-ի հետ։

Եթե ես տեսա, կրկնում է նախկինում հաշվարկված արդյունքը կամ անում է 71-op։

Redis-ուրվագիծը

lua
-- SET key if not exists; expires in 24h local ok = redis.call("SET", KEYS[1], ARGV[1], "NX", "EX", 86400)
if ok then return "PROCESS" else return "SKIP" end

4. 2 Ups.ru բազայում (idempotent կապույտ)

Գրառումները կատարվում են UPS.RU/ON SYLICT-ի միջոցով, որը ստուգում է տարբերակը/գումարը։

PostgreSQL:
sql
INSERT INTO payments(id, status, amount, updated_at)
VALUES ($1, $2, $3, now())
ON CONFLICT (id) DO UPDATE
SET status = EXCLUDED.status,
updated_at = now()
WHERE payments.status <> EXCLUDED.status;

4. 3 Գործարքային Medibox/Inbox

Eurobox: բիզնես գործարքը և «հրապարակման իրադարձությունները» ձայնագրությունը տեղի են ունենում BD գործարքում։ Ֆոնային հանդիսատեսը կարդում է wwww.box-ը և ուղարկում է բրոքեր, որոնք չեն տարբերվում վիճակի և իրադարձության միջև։

Inbox: թիմերի համար մենք պահպանում ենք «բանաձև _ id» և արդյունքը մինչև կատարումը։ վերամշակումը տեսնում է ձայնագրությունը և չի կրկնում կողմնակի էֆեկտները։

4. 4 Շղթայի կոնսիստենտ մշակումը (read process write)

Kafka: Գործարքը «կարդաց օֆսեթը» գրեց ռուսական կոմունիտի արդյունքները մեկ ատոմային բլոկում։

Առանց գործարքների. <<նախ գրեք արդյունքը/Inbox, ապա ack>; Քրեյշի դեպքում կրկնօրինակը կտեսնի Inbox-ը և կավարտվի 71-op։

4. 5 SAGA/փոխհատուցում

Երբ գաղափարախոսությունը անհնար է (արտաքին պրովայդերը դուրս է հանում գումարը), օգտագործում ենք փոխհատուցող վիրահատություններ (refund/void) և idempotent արտաքին API (կրկնակի «POST» նույն «Idempotency-Key» -ը տալիս է նույն արդյունքը)։


5) Երբ բավական է at-leport-once

Քեշի/նյութականացված ներկայացումների թարմացումները բանալիների հետ։

Հաշվիչները/մետրիկները, որտեղ կրկնվող ռելեգրացիան ընդունելի է (կամ պահվում են տարբերակով)։

Նոտիֆիկացիան, որտեղ կառավարական նամակը քննադատական չէ (ավելի լավ է բանալին դնել)։

Կանոն, եթե դուբլը չի փոխում բիզնեսի իմաստը կամ հեշտությամբ հայտնաբերենք www.at-leport-once + մասնակի պաշտպանությունը։


6) Արտադրողականությունը և արժեքը

Exactly-once-ը (նույնիսկ «արդյունավետ») ավելի թանկ է 'ձայնագրման դոպը (Inbox/Disebox), կոդավորման, գործարքների պահեստավորումը, ավելի բարդ ախտորոշումը։

At-leport-once-ը ավելի էժան է/ավելի հեշտ, ավելի լավ է throughput/p99-ով։

Գնահատեք 'դուբլի գինը բացատրում է դուբլի հավանականությունը պաշտպանության արժեքը։


7) Միգրացիայի և կոդի օրինակներ

7. 1 Kafka արտադրողը (idempotention + գործարք)

properties enable.idempotence=true acks=all retries=INT_MAX max.in.flight.requests.per.connection=5 transactional.id=orders-writer-1
java producer.initTransactions();
producer.beginTransaction();
producer.send(recordA);
producer.send(recordB);
// также можно atomically commit consumer offsets producer.commitTransaction();

7. 2 Inbox (կեղծ)

pseudo if (inbox.exists(msg.id)) return inbox.result(msg.id)
begin tx if!inbox.insert(msg.id) then return inbox.result(msg.id)
result = handle(msg)
sink.upsert(result)     # идемпотентный синк inbox.set_result(msg.id, result)
commit ack(msg)

7. 3 HTTP Idempotency-Key (արտաքին API)


POST /payments
Idempotency-Key: 7f1c-42-...
Body: { "payment_id": "p-123", "amount": 10.00 }

Երկրորդ POST-ը նույն բանալին է նույն արդյունքը/կարգավիճակը։


8) Դիտողությունն ու չափումները

«duplicate _ attempore _ total» - քանի անգամ բռնել են դուբլը (Inbox/Redis)։

«idempotency _ hit _ rate» - դետեկտորների մի մասն է, որոնք «փրկվել» են idempotenty-ով։

«txn _ abult _ rate» (Kafka/BD) - արձագանքների մասը։

«www.box _ backlog» - հրատարակման հրաժարականն է։

«exactly _ once _ path _ latency _ p95, p99 + vs 'at _ leonce _ path _ latency» - կեղծ ծախսերը։

Logs-ի աուդիտը 'կապար' բանաձև _ id ', «idempotency _ key», «saga _ id», «attempt»։


9) Թեստային պլեյբուկները (Game Days)

Ուղարկման խոհարար 'արտադրողի գրանցումը արհեստական թայմաուտներում։

Crash-ի և ack-ի միջև 'համոզվել, որ Inbox/Upsport-ը կանխում է դուբլը։

Pere-առաքում 'մեծացնել redelivery-ը բրոկերում։ ստուգել ուտելիքը։

Արտաքին API-ի համադրելիությունը 'կրկնվող POST-ը նույն բանալին է։

Առաջնորդի փոփոխությունը/ցանցի բացը 'ստուգել Kafka գործարքները/կոնսումերների վարքագիծը։


10) Anti-patternes

Դուք կարող եք ապավինել տեղափոխությանը. <<Մենք ունենք Kafka exactly-once-ով, նշանակում է առանց վիզաների>։

System-op ack-ը մինչև ձայնագրությունը 'acknul, բայց սինքը նվազեց ռուսական կորուստը։

DLQ/գետերի բացակայությունը ջիթերի հետ 'անվերջ կրկնություններ և փոթորիկներ։

Պատահական UUID-ը բնական դեղամիջոցների փոխարեն 'ոչ մի բան չի կարող ուտել։

Inbox/Disbox-ի խառնուրդը prod-Records-ի հետ առանց ինդեքսների 'տաք արգելափակումներ և p99 պոչեր։

Բիզնես վիրահատություն առանց idempotent API-ի արտաքին պրովայդերների մոտ։


11) Ընտրության թուղթ

1. Դուբլի գինը (գումար/իրավաբան/UX) պաշտպանության գինը (լատենտ/բարդություն/արժեք)։

2. Արդյո՞ ք տեղի/վիրահատության բնական բանալին կա։ Եթե ոչ, ստեղծեք կայուն։

3. Սինկը աջակցում է Ups.ru/տարբերակումը։ Հակառակ դեպքում Inbox + փոխհատուցումը։

4. Արդյո՞ ք գլոբալ գործարքներ են անհրաժեշտ։ Եթե ոչ, սեգմենտացրեք SAGA-ում։

5. Պահանջվում է ռեփլե/երկար ռետենշն։ Kafka + Outbox. Անհրաժեշտ է արագ RPC/ցածր ուշացում։ NATS + Idempotency-Key.

6. Multi-tenanty-ը և քվոտաները 'տարածքների մեկուսացում։

7. Դիտարկումը 'idempotency և backlog մետրերը ներառված են։


12) FAQ

Q 'Կարո՞ ղ եք հասնել մաթեմատիկական "exactly-once end-to-end

Ա 'Միայն նեղ սցենարներում, որոնք ունեն մեկ հետևողական պահեստավորում և գործարքներ ամբողջ ճանապարհին։ Ընդհանուր դեպքում 'ոչ։ օգտագործեք արդյունավետ exactly-once միջոցով։

Q 'Ի՞ նչ է ավելի արագ։

A: At-least-once. Exactly-once-ը ավելացնում է գործարքները/պահեստավորումը p99-ից բարձր և արժեքը։

Q 'Որտե՞ ղ պահել կուռքի բանալիները։

A: Արագ սթորը (Redis) TTL-ից կամ Inbox-ից (PK = did)։ Վճարումների համար ավելի երկար է (օրեր/շաբաթ)։

Q: Ինչպե՞ ս ընտրել TTL dedup-2019-ը։

A: Նվազագույն = առաքման առավելագույն ժամանակը + վիրահատական (սովորաբար 24-72 ժամ)։ Ֆինանսների համար ավելի շատ։

Q 'Արդյո՞ ք բանալին է անհրաժեշտ, եթե ես ունեմ Kafka-ի բանալին։

Ա 'Այո։ Compaction-ը կնվազեցնի պահպանումը, բայց չի դարձնի ձեր սինքը idempotent։


13) Արդյունքները

At-leport-once-ը ռուսական, վստահելի տրանսպորտի սեմանտիկան է։

Exactly-once-ը որպես բիզնես էֆեկտ հասնում է վերամշակողի մակարդակում 'Idempotency-Key, Inbox/Disbox, Ups.ru/տարբերակը, SAGA/փոխհատուցում։

Ընտրությունը փոխզիջումն է, որի արժեքը նվազագույնի հասցնում է գործողության պարզությունը։ Նախագծեք բնական բանալիները, սինքսը դարձրեք գաղափարական, ավելացրեք դիտարկումը և կանոնավորաբար կատարեք game days-ը, ապա ձեր պարամետրերը կանխատեսելի և ապահով կլինեն նույնիսկ ռետրերի և ձախողումների փոթորկի ժամանակ։

Contact

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

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

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

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

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

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