Транзакциялык месседжинг
Транзакциялык месседжинг - жергиликтүү мамлекеттик өзгөрүүлөр (БД/кэш) менен брокер/шинадагы билдирүүлөрдүн ортосундагы шайкештикти камсыз кылган архитектуралык ыкмалардын жыйындысы. Максаты: "абалы жазылган, билдирүү жоголгон эмес жана кайталанган эмес" ката, ретра, масштабдоо жана көп тенанттуулук.
1) Жеткирүү семантикасы
At-most-once: тез жана арзан, жоготуу мүмкүн, дубль жок.
At-least-once: билдирүүлөрдү жоготпойт, мүмкүн дубль → демпотенттик талап кылынат.
(Натыйжалуу) Exactly-once: эч кандай жоготуулар жана эч кандай көзгө көрүнгөн бизнес-таасирлери, техникалык айкалышы (outbox/inbox, өндүрүүчүнүн бүтүмдөрдү/консумер, дедуп) жетишилет.
2) Эмне үчүн "эки жазуу" коркунучтуу
"Адегенде БДга жазабыз, анан дөңгөлөккө жөнөтөбүз" деген жөнөкөй логика (же тескерисинче) кадамдардын ортосунда кулаганда үзүлөт: маалыматтар жазылган, ал эми окуя жоголгон; же окуя кетти, бирок маалымат жок. Транзакциялык билдирүү бул ажырымды жок кылат.
3) Негизги үлгүлөр
3. 1 Outbox (өндүрүүчү)
Бир жергиликтүү транзакцияда биз бизнес өзгөрүүнү жана 'outbox' таблицасына сапты жазабыз; өзүнчө publisher outbox окуйт жана retrains жана backoff менен брокер жарыялайт. Жоготуулар алынып салынат; керектөөчүлөрдүн демпотенттүүлүгүн.
3. 2 Inbox/Idempotent керектөөчү (керектөөчү)
Эффектти аткаруудан мурун, консюмер негизги ачкыч катары 'INSERT' in 'inbox (consumer, event_id)' кылат. Негизги чыр-чатак = окуя буга чейин иштелип чыккан → сагынам. Ошентип, "натыйжалуу exactly-once" жетишилет.
3. 3 Offset транзакциясы менен Read-Process-Write
Log-багытталган шиналар үчүн шаблон: consumer ошол эле бүтүмгө бизнес өзгөрүү жана "өткөн offset" жазылган батч окуйт. Коммиттен кийин брокер билдирүүлөрдү керектелген деп эсептейт. Бул жок кылат "окуп → кулап → кайталап" эч кандай дубль таасири.
3. 4 TSS/Кызмат аралык таасирлери үчүн сагалар
Сиз макулдашылган көп кадам жараянын керек болгондо, биз TCC же сагаларды колдонобуз; билдирүүлөр - командаларды/окуяларды ташуу, ал эми транзакциялуулук - кадамдардын жана компенсациялардын деңгээлинде.
4) Идемпотенттик өндүрүүчүлөр жана консультанттар
Продюсер: туруктуу 'message _ id '/' idempotency _ key', ошол эле ачкыч менен кайра жөнөтүү абоненттерге жаңы таасир бербейт; негизги ырааттуулугун (sequence) сактоо.
Consumer: 'inbox' + бизнес-идемпотенттүүлүк (upsert/merge, акыркы нускасын текшерүү/текшерүү).
5) Тартиби жана себептери
Бизнес ачкычы боюнча партиялаштыруу (мисалы, 'aggregate _ id', 'tenant _ id'), бир объектинин окуялары өз ордунда болушу үчүн.
Партиянын ичинде ырааттуу номурларды/убакыт белгилерин сактаңыз; DLQдан редрайвде "ачкыч жана ырааттуу" сактаңыз.
Эгерде дүйнөлүк тартип критикалык эмес болсо, ачкычтын жергиликтүү тартибин камсыз кылуу жана домендин инвариантын бекитүү.
6) Offsets жана бекитүү таасирлери
Вариант А: "DD Offset"
"Акыркы иштетилген оффсетти (partition, offset)" домендик маалыматтарды өзгөрткөн транзакцияга жазыңыз. кайра-жылы кийинки offset менен улантуу, кайталап таасир качуу.
Вариант В: "Брокердин транзакциясы"
Кээ бир брокерлер бир бүтүм Producer/Consumer алкагында билдирүүлөр жана Offset атомдук жазуу колдойт. Колдо болсо, колдонуңуз, бирок ар дайым керектөөчүнүн демпотенттигин толуктаңыз.
7) Retrains, backoff, DLQ
Кайталап гана retraible каталар (убакыт, 5xx), экспоненциалдуу backoff жана Jitter менен.
Нон-ретраибл (schema/валидация) - метаданалар менен DLQде дароо (tenant, key, offset, себеп).
DLQ From Redrave дозалап (batch, rate limit), кайра чейин схемасын текшерүү, ачкыч тартибин сактоо.
8) Көп тенанттуулук жана региондор
'tenant _ id', 'plan', 'region' деген метадеректерди жана партиялаштыруу ачкычтарын киргизиңиз.
Per-tenant fairness: "ызы-чуу" кардар башкалардын бюджетин бөлүп жок, ошондуктан жарыялоо/иштеп чыгууну чектөө.
Residency: домендик маалыматтар менен бир аймакта билдирүүлөрдү жана outbox сактоо; аймактар аралык репликациялар - асинхрондук агрегаттар.
9) Байкоо жана аудит
Trace: корреляция 'event _ id '/' aggregate _ id '/' saga _ id', уктап "read → process → write/commit".
Метрика: жарыялоо/кайра иштетүү артта (p95/p99), ийгиликтин үлүшү, DLQ-rate, redrave ийгилиги, "кайталанышы басылган".
Logi: кыска ийгиликке; каталар боюнча майда-чүйдөсүнө чейин (себеп, аракет, ачкыч, оффсет).
Аудит: ким редрайвил/коньки, кандай батч жана кандай жыйынтык менен.
10) Коопсуздук жана шайкештик
Payload PII минималдаштыруу; DLQ/LOGs которууда жашыруу.
Кол коюу/тышкы шиналар үчүн билдирүүлөрдү шифрлөө; кызматтардын ортосунда mTLS колдонуу.
Сактоо мөөнөтүн жана "унутуу укугун" per tenant/region башкаруу.
11) Типтүү интеграциялык схемалар
1. Кызмат булагы (write-side)
Жергиликтүү транзакция: домен жазуусу + outbox.
Коомдук: батчи, 'SKIP LOCKED', backoff, per tenant лимиттери.
lag 'now − occurred_at' мониторинг жүргүзүү.
2. Керектөө кызматы (read-side)
Окуу батч → аракет 'INSERT inbox (consumer, event_id)' → ийгиликтүү болсо, биз таасир аткарат.
Ошол эле транзакцияда биз "өткөн офсетти" (вариант А) каттайбыз же брокердин транзакциясына таянабыз (вариант В).
Ката: саясат боюнча retrai же DLQ.
3. Проекция/материалдаштырылган көрүнүш
Бир гана демпотенттик апдейт (upsert), компакт ачкычтар, мезгил-мезгили менен текшерүү суммасын.
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) Азык-түлүктүн алдындагы чек-тизме
- Жок "эки жазуу": өндүрүүчүдө outbox же бир бүтүмгө бир offset жана таасир бекитүү.
- Idempotent Consumer: 'inbox '/dedup-журнал, бизнес-Idempotent иш.
- Бизнес ачкычы боюнча партиялаштыруу, жергиликтүү тартип сакталды.
- Backoff + Jitter менен Retray, каталарды классификациялоо, бай метадеректер менен DLQ.
- Redrave дозаланган, коопсуз; плейбуктар бар.
- Көп-тенанттык лимиттер жана артыкчылыктар; tags 'tenant _ id/plan/region'.
- Телеметрия: лагдар, ийгиликтин үлүшү, "дубликаттар басылган", p95/p99 боюнча алерталар.
- PII/retenshn/шифрлөө саясаты сакталат.
- Тесттер: кадамдардын ортосунда түшүп, дубликаттар, ачкыч тартиби, массалык редрайв.
14) типтүү каталар
outbox/offset бүтүмү жок өзүнчө кадамдар менен шина жана DD жазуу жөнөтүү.
Consumer эч кандай идемпотенттүүлүк → терс таасирлери кайталанат.
Глобалдык тартип "кандай болсо да" - кымбат жана сейрек акталат; жол-жобосу жетиштүү.
чектөөсүз массалык redrave → экинчи окуя.
Tracing/лаг-метрика → "жашыруун деградация" жок.
DLQ/logs PII аралаштыруу.
15) Тез Recipes
SaaS-окуялар: Outbox + Idempotent Consumer (inbox), партиялаштыруу 'tenant _ id: aggregate _ id'.
ETL/проекциялар: Read-process-write бир бүтүмүндө offset бекитүү менен, батчи 500-1000, upsert.
Жогорку жүк: publichers, 'SKIP LOCKED', WFQ per tenant, lag control.
Катуу комплаенс зонасы: аймактык outbox, shifring payload, retenshn жана аудит redrave.
Корутунду
Транзакциялык месседжинг - бул маалыматтарды жана билдирүүлөрдү бириктирүү дисциплинасы. Outbox/inbox айкалыштыруу, DLQ менен Effects жана башкарылуучу Retray менен Offset бекитүү, сиз глобалдык кулпулары жок практикалык exactly-once жүрүм-турумун алуу жана SLO да, ийгиликсиздик, чокулары жана татаал көп тенанттык иш менен сакталат.