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