Паёмнависии транзаксионӣ
Паёмнависии транзаксионӣ маҷмӯи усулҳои меъморӣ мебошад, ки мувофиқати байни тағиротҳои маҳаллӣ (пойгоҳи додаҳо/кэш) ва паёмҳоро дар брокер/автобус таъмин мекунад. Мақсад: "ҳолат собит аст ↔ паём гум намешавад ё такрор намешавад" дар ҳолати нокомӣ, бозпас гирифтан, миқёс ва бисёрҳуҷрагӣ.
1) Семантикаи таҳвил
Дар аксар ҳолатҳо: зуд ва арзон, талафот имконпазиранд, не.
Ҳадди аққал як бор: паёмҳоро гум намекунад, нусхабардорӣ имконпазир аст → idempotency талаб карда мешавад.
(Самаранок) Маҳз як маротиба: талафот ва ҳеҷ гуна намоён барои эффектҳои тиҷорӣ, ки тавассути маҷмӯи усулҳо ба даст оварда мешаванд (қуттиҳо/паёмдонҳо, муомилоти истеҳсолкунанда/истеъмолкунандагон, тарҳ).
2) Чаро "ду ҳарф" хатарнок аст
Мантиқи содда "аввал ба пойгоҳи додаҳо нависед, баъд ба автобус фиристед" (ё баръакс) ҳангоми афтидан дар байни қадамҳо танаффус мегирад: маълумот собит мешавад ва ҳодиса гум мешавад; ё ҳодиса нест шудааст, аммо маълумоте нест. Паёмнависии транзаксионӣ ин холигоҳро бартараф мекунад.
3) Намунаҳои асосӣ
3. 1 Outbox (истеҳсолкунанда)
Дар як амалиёти маҳаллӣ, мо тағироти тиҷорат ва сатрро ба ҷадвали 'outbox' менависем; ношири алоҳида outbox-ро мехонад ва дар брокер бо бозгашт ва бозгашт нашр мекунад. Талафот хориҷ карда шуданд; дучандон бо номутобиқатӣ дар байни истеъмолкунандагон хомӯш карда мешаванд.
3. 2 паёмдони/истеъмолкунандаи Idempotent
Пеш аз иҷрои таъсир, истеъмолкунанда 'INSERT' -ро дар 'паёмдони (истеъмолкунанда, event_id)' ҳамчун калиди асосӣ месозад. Ихтилофи калидӣ = ҳодисае, ки аллакай коркард шудааст → гузаред. Ин аст, ки чӣ тавр "ба таври муассир як маротиба" ба даст оварда мешавад.
3. 3 Раванди хондан-навиштан бо муомилоти ҷубронӣ
Шаблон барои автобусҳои ба журнал нигаронидашуда: истеъмолкунанда партияро мехонад, дар ҳамон амалиёт тағироти тиҷорат ва "ҷуброни гузаштаро сабт мекунад. "Пас аз содир кардани ӯҳдадорӣ, брокер паёмҳои истеъмолшударо баррасӣ мекунад. Ин бидуни такрори таъсир "хондан → афтодан → такрор" -ро бартараф мекунад.
3. 4 TSS/Sagas барои эффектҳои interservice
Вақте ки ба шумо раванди пайдарпайи бисёрқабата лозим аст, TCC ё сагҳоро истифода баред; паёмҳо - интиқоли фармонҳо/рӯйдодҳо ва муомилот - дар сатҳи қадамҳо ва ҷубронҳо.
4) Истеҳсолкунандагон ва истеъмолкунандагони Idempotent
Истеҳсолкунанда: 'message _ id '/' idempotency _ key', дубора бо ҳамон калид барои муштариён эффектҳои нав эҷод намекунад; пайдарпайиро аз рӯи калид нигоҳ доред.
Истеъмолкунанда: 'паёмдони' + номутобиқатии тиҷорат (боло/якҷоя кардан, версияи охирин/таҷдиди назарро санҷед).
5) Тартиб ва сабабҳо
Бо калиди тиҷорат иштирок кунед (масалан, 'агрегат _ ид', 'иҷорагир _ ид'), то ҳодисаҳои як объект ба тартиб дароянд.
Рақамҳо/мӯҳлатҳои пайдарпайро дар дохили лот нигоҳ доред; ҳангоми азнавсозӣ аз DLQ, "бо калид ва пайдарпай" риоя кунед.
Агар тартиботи глобалӣ муҳим набошад, тартиботи маҳаллиро бо калид таъмин кунед ва инвариантҳои домейнро ислоҳ кунед.
6) Ҷубронҳо ва эффектҳои ислоҳ
Варианти A: "Ҷуброн дар DB"
"Ҷуброни охирини коркардшуда (қисм, ҷуброн)" -ро ба ҳамон амалиёте нависед, ки дар он шумо маълумоти домейнро иваз мекунед. Ҳангоми аз нав оғоз кардан, аз ҷуброни навбатӣ идома диҳед ва аз таъсири такрорӣ канорагирӣ кунед.
Варианти B: Амалиёти брокер
Баъзе брокерҳо сабти атомии паёмҳо ва ҷубронро дар як амалиёти истеҳсолкунанда/истеъмолкунанда дастгирӣ мекунанд. Агар дастрас бошад, истифода баред, аммо ҳамеша бо idempotency дар истеъмолкунанда илова кунед.
7) Retrai, backoff, DLQ
Танҳо хатогиҳои барқароршавандаро такрор кунед (танаффус, 5xx), бо пушти экспоненсиалӣ ва ҷиттер.
Баргардонидан (схема/санҷиш) - фавран дар DLQ бо метамаълумот (иҷорагир, калид, ҷуброн, сабаб).
Миқдори дубора аз DLQ (партия, меъёри меъёр), пеш аз такрор гардишро санҷед, фармоишро аз рӯи калид риоя кунед.
8) Бисёрҳуҷрагӣ ва минтақаҳо
Дохил кардани 'иҷорагир _ ид', 'нақша', 'минтақа' дар метамаълумоти паём ва тугмаҳои қисмбандӣ.
Адолати иҷорагир: Нашр/коркарди маҳдудро маҳдуд кунед, то муштарии "ғавғо" буҷаро аз дигарон тарҳ накунад.
Истиқомат: нигоҳ доштани паёмҳо ва қуттиҳо дар ҳамон минтақа бо додаҳои домейн; нусхаҳои байниминтақавӣ - агрегатҳои асинхронӣ.
9) Мушоҳида ва аудит
Пайгирӣ: коррелятсияи 'event _ id '/' agregate _ id '/' saga _ id', фосилаи 'раванди хондан → навиштан/содир кардан'.
Нишондиҳандаҳо: ақибмонии нашр/коркард (p95/p99), сатҳи муваффақият, сатҳи DLQ, муваффақияти дубора, "нусхаҳои фишурдашуда".
Гузоришҳо: кӯтоҳ барои муваффақият; тафсилот дар бораи хатогиҳо (сабаб, кӯшиш, калид, ҷуброн).
Аудит: кӣ дубора/ғелонда шуд, кадом гурӯҳ ва бо кадом натиҷа.
10) Бехатарӣ ва риояи
PII-ро дар сарборӣ кам кунед; Маска ҳангоми интиқол ба DLQ/гузоришҳо.
Имзо/рамзгузории паёмҳо барои автобусҳои беруна; дар байни хизматрасониҳо MTLS-ро истифода баред.
Идоракунии мӯҳлати нигоҳдорӣ ва "ҳуқуқи фаромӯш кардан" ба як иҷорагир/минтақа.
11) Схемаҳои муқаррарии ҳамгироӣ
1. Манбаи хидмат (тарафи хаттӣ)
Амалиёти маҳаллӣ: сабти домейн + outbox.
Ношир: маҷмӯаҳо, 'SKIP LOCKED', бозгашт, маҳдудиятҳои як иҷорагир.
Мониторинги lag 'now − occurred_at'.
2. Хизматрасонӣ-истеъмолкунанда (тарафи хондан)
Ҳангоми хондани партия → кӯшиши 'INSERT паёмдони (истеъмолкунанда, event_id) →, агар муваффақ бошем, мо самараро иҷро мекунем.
Дар худи ҳамон амалиёт, мо "ҷуброни қабулшуда" (варианти А) -ро ислоҳ мекунем ё ба муомилоти брокер такя мекунем (варианти B).
Хатогӣ: бозпас ё DLQ аз рӯи сиёсат.
3. Дурнамо/Намуди материализатсияшуда
Танҳо навсозиҳои idempotent (upsert), калидҳои фишурдаи такрорӣ, санҷиши даврии checksum.
12) Қолибҳои танзимот (мисол)
yaml producer:
idempotency_key: event_id partition_key: "{tenant_id}:{aggregate_id}"
retry:
max_attempts: 8 initial_ms: 200 max_ms: 8000 strategy: exponential_full_jitter
consumer:
batch: 500 offset_commit: "with_domain_tx" # или "broker_tx"
inbox_enabled: true concurrency_per_partition: 4 dlq:
enabled: true batch_redrive: 200 rate_limit_per_sec: 50 order_by_key: true
observability:
metrics:
- processing_lag_ms
- publish_success_ratio
- dlq_rate
- redrive_success_ratio tracing_tags: [event_id, tenant_id, aggregate_id, partition, offset]
13) Рӯйхати санҷиши пеш аз фурӯш
- "ду ҳарф" -ро нест кард: баромади истеҳсолкунанда ё муайян кардани ҷуброн ва таъсир дар як амалиёт дар истеъмолкунанда.
- Истеъмолкунандаи Idempotent: 'паёмдони '/маҷаллаи dedup, аблаҳии тиҷорат.
- Тақсимот аз рӯи калиди тиҷорат, тартиботи маҳаллӣ риоя карда мешавад.
- Бозгашти Backoff + jitter, таснифи хатогӣ, DLQ-и бойи метамаълумот.
- Redrave холӣ, бехатар; китобҳои бозӣ мавҷуданд.
- Маҳдудиятҳо ва афзалиятҳои иҷорагир; 'иҷорагир _ ид/нақша/tags минтақа.
- Телеметрия: ақибмонӣ, сатҳи муваффақият, "такрори фишурдашуда", огоҳӣ аз p95/p99.
- Сиёсати PII/нигоҳдорӣ/рамзгузорӣ татбиқ карда мешавад.
- Санҷишҳо: байни қадамҳо, нусхабардорӣ, тартиби асосӣ, азнавсозии оммавӣ.
14) Хатогиҳои маъмулӣ
Фиристодан ба автобус ва навиштан ба пойгоҳи додаҳо дар марҳилаҳои алоҳида бидуни амалиёти outbox/offset.
Истеъмолкунанда бидуни idempotency → таъсири тарафҳоро такрор мекунад.
Тартиби глобалии "биёед чӣ" гарон аст ва хеле кам асоснок аст; фармоиши кофӣ аз рӯи калид.
Нашри азим бидуни маҳдудият → ҳодисаи дуюмдараҷа.
Набудани ченакҳои пайгирӣ/ақибмонӣ → "таназзули пинҳон".
Омезиши PII дар DLQ/гузоришҳо.
15) Дорухатҳои зуд
Чорабиниҳои SAA: Outbox + истеъмолкунандаи номатлуб (паёмдони қуттӣ), тақсимот аз ҷониби 'иҷорагир _ id: agregate _ id'.
ETL/пешгӯиҳо: Хондани равандҳо-навиштан бо ислоҳи ҷубронҳо дар як амалиёт, маҷмӯи 500-1000, ғамгин.
Сарбории баланд: Нашри shardings, 'SKIP LOCKED', WFQ ба иҷорагир, назорати ақиб.
Минтақаи риояи қатъӣ: қуттии минтақавӣ, рамзгузории сарборӣ, нигоҳдорӣ ва аудити redrives.
Хулоса
Паёмнависии транзаксионӣ интизоми пайвастани маълумот ва паёмҳо мебошад. Бо омезиши қуттиҳо/паёмдонҳо, номутобиқатӣ, ислоҳкунӣ дар якҷоягӣ бо эффектҳо ва такрори идорашаванда бо DLQ, шумо рафтори дақиқи яквақта бидуни қуфлҳои ҷаҳонӣ ба даст меоред ва SLO-ро ҳатто бо садамаҳо, қуллаҳо ва истисмори мураккаби бисёр иҷорагир нигоҳ медоред.