Зеҳн

Тарҳрезии пардохт ва ҳамёни электронӣ дар миқёси калон: вақте пул интиқол ёфтааст, аммо ҷавоб нарасидааст

БА
Барномасоз25 сентябри 2026 · 31 дақиқа хондан

Корбар як миллион сомон пардохт мекунад. Бонк маблағро аз ҳисобаш мегирад, аммо ҷавоби даргоҳи пардохт ба сервери мо намерасад. Саҳифа ҳанӯз бор мешавад ва корбар дубора тугмаи «Пардохт»-ро пахш мекунад.

Пас аз чанд сония аз даргоҳ рӯйдоди муваффақияти пардохт мерасад. Worker коркардро оғоз мекунад, тағйироти пойгоҳи додаҳоро сабт менамояд ва маҳз пеш аз эълони анҷоми кор аз дастрасӣ мебарояд. Даргоҳ низ, чун ҷавоби равшан нагирифтааст, ҳамон рӯйдодро дубора мефиристад.

Аз назари корбар танҳо як харид анҷом шудааст. Аз назари backend бошад, чанд дархост, чанд паём ва чанд натиҷаи номуайян дорем.

Чӣ гуна бовар ҳосил кунем, ки ин кӯшишҳои такрорӣ пулро ду бор интиқол намедиҳанд ва ҳар маблағи воқеан интиқолёфта дар низоми мо пайгиришаванда аст?

Тарҳрезии пардохт аз ҳамин савол оғоз мешавад. Доштани API-ҳои pay, refund ва transfer кофӣ нест. Бояд бидонем, ки ҳангоми гум шудани ҷавоб, ҳамзамон расидани ду дархост ё пайдо шудани ихтилоф байни воқеияти даргоҳ ва пойгоҳи додаҳои мо низом чӣ гуна рафтор мекунад.

Дар ин мақола платформаи фарзиро бо пардохти онлайн, ҳамёни электронӣ ва ҳисоббаробаркунӣ бо фурӯшандагон тарҳрезӣ мекунем. Меъморӣ ва рақамҳо пешниҳод ва фарзияҳои тарҳрезӣ мебошанд; онҳо зерсохтори дохилии ягон ширкати мушаххасро тавсиф намекунанд.

Мақсад аз «пул» дар идомаи матн ҳам ҳаракати воқеии маблағ дар низоми беруна ва ҳам сабти қарзу талаботи мувофиқ дар дафтари кулли дохилӣ аст. Ин ду бояд бо ҳам муқоиса ва мувофиқ карда шаванд.

1. Аввал муайян кунем, ки ба корбар чӣ ваъда медиҳем

Низом бояд ба корбар имкон диҳад, ки пардохт эҷод кунад, ҳамёнашро пур намояд, бақия ва таърихи амалиётро бинад, пул интиқол диҳад ва дархости гирифтани маблағ ё баргардонидани пардохтро пешниҳод кунад.

Фурӯшанда низ бояд бидонад, ки чӣ қадар маблағ ба ӯ тааллуқ дорад, кадом қисми он ҳанӯз қобили ҳисоббаробаркунӣ нест ва кадом интиқоли бонкӣ анҷом шудааст.

Аммо дар паси ин имкониятҳо чанд уҳдадории муҳимтар вуҷуд дорад:

  • Дархости такрорӣ набояд таъсири нави молиявӣ ба вуҷуд орад.
  • Хароҷот набояд аз бақияи иҷозатдодашуда зиёд шавад.
  • Маблағи баргардонидани пардохтҳои муваффақ ва дар ҳоли иҷро набояд аз ҳадди иҷозатдодашуда зиёд гардад.
  • Ҳар сабти молиявӣ бояд маблағ, асъор, сабаб ва истиноди мушаххас дошта бошад.
  • Ҳолати номуайян бояд қобили барқарорсозӣ бошад ва иштибоҳан «номуваффақ» нишон дода нашавад.
  • Ислоҳи хато бояд таърихро нигоҳ дорад.

Инҳо инвариантҳои соҳаи масъала мебошанд: қоидаҳое, ки вайрон шудани онҳо маънои рафтори нодурусти молиявиро дорад. Суръат ва дастрасиро бояд дар доираи ҳамин қоидаҳо беҳтар кунем.

Масалан, агар ҳангоми гузариш ба сервери эҳтиётии пойгоҳи додаҳо — failover — бақияи боэътимодро санҷида натавонем, муваққатан боздоштани интиқол қарори асоснок аст. Қабул кардани интиқол бо бақияи кӯҳна, танҳо барои он ки API ҷавоби муваффақ диҳад, мушкилро ба оянда мегузаронад.

Ин интихоб маънои камаҳамият будани дастрасиро надорад. Тарҳ бояд хондани ҳолат, пайгирии фармоиш ва нишон додани паёми муносибро то ҳадди имкон нигоҳ дорад, ҳатто вақте сабти ҳаракати нави пул муваққатан маҳдуд шудааст.

2. Миқёс шакли сарбориро муайян мекунад

Фарз кунем, платформа 10 миллион корбари сабтиномшуда, 2 миллион корбари фаъоли моҳона ва ҳар рӯз 500 ҳазор амалиёти молиявӣ дорад.

Миқдори миёнаи амалиёт дар як сония он қадар калон нест:

500 000 ÷ 86 400 ≈ 5,8 амалиёти тиҷоратӣ дар як сония

Аммо миёна соатҳои серкори низомро тавсиф намекунад. Фурӯши махсус ё рӯзи ҳисоббаробаркунӣ метавонад сарбориро дар фосилаи кӯтоҳ мутамарказ кунад.

Барои ин тарҳ авҷи маъмулии сарбориро аз 100 то 250 амалиёт дар як сония ва сенарияи санҷиши фишорро зиёда аз 1000 амалиёт дар як сония мегирем. Ин рақамҳо фарзияанд ва бояд бо додаҳои воқеӣ ислоҳ шаванд.

Як амалиёти тиҷоратӣ ҳатман як навиштан дар пойгоҳи додаҳо нест. Агар ҳар амалиёт ба ҳисоби миёна чор сатри дафтари кулл созад, ҳар рӯз тақрибан ду миллион Ledger Entry хоҳем дошт.

Бо фарзияи 300–700 байт барои ҳар сатр ва ҳиссаи индексҳои он, ҳаҷми асосии ҳаррӯза тақрибан 0,6–1,4 гигабайт мешавад. WAL, репликаҳо, нусхаҳои эҳтиётӣ ва додаҳои иловагӣ алоҳида ҳисоб мешаванд.

Сарбории хондани ҳолат ва таърих низ бо сарбории сабти пул яксон нест. Callback-ҳои такрорӣ, санҷишҳои даврӣ ва ҳисоботҳои ҳисоббаробаркунӣ ҳар кадом шакли гуногуни сарборӣ доранд.

Аз ин рӯ, танҳо донистани TPS барои интихоби меъморӣ кофӣ нест. Бояд ҳисобҳои сербор, шумораи сабтҳои ҳар амалиёт ва муддати нигоҳ доштани қулфҳоро низ бишносем.

Чанд ҳадафи аввалия барои санҷиши тарҳ:

  • Эҷоди Payment Intent-и дохилӣ: таъхири p95 камтар аз 250 миллисония, бе ҳисоб кардани вақти ҷавоби даргоҳ.
  • Хондани бақия: p95 камтар аз 100 миллисония.
  • Интиқоли дохилии ҳамён: p95 камтар аз 400 миллисония дар сарбории муайяншуда.
  • Қабул ва нигоҳдории пойдори Webhook-и эътиборнок: p95 камтар аз 200 миллисония.

Ниҳоӣ шудани пардохт ё ҳисоббаробаркунӣ ба рафтори провайдер низ вобаста аст. Ин қисмро бояд бо нишондиҳандаҳое мисли муддати дар ҳолати номуайян мондани пардохт ва вақти мувофиқсозӣ чен кард.

3. Меъмориро аз марзҳои молиявӣ бисозем

Барои оғоз монолити модулӣ — Modular Monolith бо модулҳои равшан ва PostgreSQL-и муштарак интихоби муносиб аст.

Payment, Wallet, Ledger, Refund ва Settlement масъулиятҳои ҷудогона доранд. Аммо тағйироте, ки бояд якҷоя commit шаванд, ҳанӯз дар дохили як транзаксияи маҳаллӣ мемонанд.

Тасдиқи беруна пеш аз сабти ниҳоӣ санҷида мешавад. Тағйири ҳолати пардохт, сабти дафтари кулл, бақияи марбут ва Outbox дар як транзаксияи PostgreSQL ҷой мегиранд. Тамоси шабакавӣ қисми ин транзаксия нест.

Модули Payment масъули кӯшишҳои пардохт ва ҳамоҳангсозӣ бо даргоҳ аст. Wallet сиёсати бақияи қобили харҷ ва маблағи бандшударо идора мекунад. Ledger сабти молиявиро анҷом медиҳад. Refund ва Settlement низ давраи ҳаёти мустақили худро доранд.

Gateway Adapter фарқҳои провайдерҳоро аз ҳастаи низом ҷудо мекунад. Як даргоҳ метавонад authorization ва capture-и ҷудогона дошта бошад; дигаре танҳо пардохт ва verify пешниҳод кунад. Мавҷудияти Webhook-и имзошуда, имкони inquiry ва дастгирии idempotency низ бояд дар модели қобилиятҳои ҳар провайдер сабт шаванд.

Reconciliation ихтилофи байни додаҳои дохилӣ ва ҳисоботи беруниро пайдо мекунад. Ин модул танҳо истеъмолкунандаи рӯйдодҳои муваффақ нест. Он бояд мустақил аз паёмҳо пардохтҳои дармонда ва ҳисоботҳои давриро санҷида тавонад.

Redis барои cache, маҳдудкунии суръати дархостҳо ва додаҳои муваққатӣ мувофиқ аст. Kafka ё брокери дигар нашри рӯйдодҳо ва коркардҳои иловагиро ҷудо мекунад. Ҳеҷ кадоми онҳо ҷойи PostgreSQL-ро ҳамчун манбаи асосии ҳақиқати молиявӣ намегиранд.

Ҷудо кардани сервис вақте арзиш дорад, ки сарборӣ, масъулияти даста, талаботи амниятӣ ё давраи мустақили нашри он равшан бошад. Ҷудо кардани Ledger аз пойгоҳи додаҳои модулҳои дигар марзи кунунии атомиро тағйир медиҳад ва тарҳрезии навро талаб мекунад.

4. Payment Intent: ҳувияти амалиёт пеш аз тамос бо даргоҳ

Пеш аз фиристодани корбар ба даргоҳ бояд бидонем, ки ӯ барои чӣ, ба кӣ ва бо кадом маблағ пардохт мекунад. Payment Intent ҳамин қарори дохилиро нигоҳ медорад.

Маблағ аз фармоиш ё ҳисобкунии боэътимоди сервер гирифта мешавад. amount-и фиристодаи браузер ба танҳоӣ асоси гирифтани пул нест. Шиносаи корбар, фурӯшанда, фармоиш, асъор ва версияи маблағи қабулшуда низ ба ҳамин қарор пайваст мешаванд.

Дар баробари Intent беҳтар аст кӯшишҳои тамос бо провайдерро дар payment_attempts нигоҳ дорем. Як Intent метавонад дар давраи ҳаёташ чанд кӯшиш дошта бошад, аммо ҳар attempt бояд истиноди беруна ва натиҷаи худро ҳифз кунад.

Payment Intent
  id, order_id, user_id, merchant_id
  amount, currency, status, version

Payment Attempt
  id, payment_id, provider, provider_account_id
  merchant_reference, external_reference
  status, requested_at, last_checked_at

Мавҷудияти Intent ба мо иҷозат намедиҳад, ки муваффақияти даргоҳро тахмин кунем. Даргоҳ манбаи ҳолати амалиёти худ аст; мо масъули ҳолати тиҷоратӣ ва сабти дохилӣ ҳастем. Ин ду воқеият бо reference-и эътиборнок ва мувофиқсозӣ ба ҳам пайваст мешаванд.

Ҳамин нукта ҳангоми retry муҳим аст. Агар натиҷаи сохтани session номуайян шуд, набояд фавран дар даргоҳи дигар attempt-и нав созем. Аввал бояд муайян кунем, ки кӯшиши пешина қобили барқарорсозӣ ҳаст ё не. Дар акси ҳол, як харид метавонад ба ду пардохти воқеӣ табдил ёбад.

5. Ҳолати номуайян як ҳолати воқеист

Сутуни озоде бо номи status, ки ҳар қисми барнома онро тағйир медиҳад, модели боэътимоди пардохт нест. Ҳар гузариш бояд фармон, пешшарт ва далели мушаххас дошта бошад.

Барои ҷараёни сода метавон чунин ҳолатҳоро пешбинӣ кард:

CREATED → PENDING

Аз PENDING:
  → CAPTURED
  → FAILED_CONFIRMED
  → UNKNOWN

Аз UNKNOWN:
  → CAPTURED          [муваффақияти тасдиқшуда]
  → FAILED_CONFIRMED  [нокомии ниҳоии тасдиқшуда]

Ин модел намунавӣ аст. Даргоҳе, ки authorization-и мустақил дорад, ба ҳолатҳои бештар ниёз дорад. Номҳои дохилиро низ набояд бе таваҷҷуҳ ба шартномаи провайдер ҳаммаънои номҳои API-и ӯ донем.

Timeout танҳо мегӯяд, ки ҷавоб ба мо нарасидааст. Мумкин аст амалиёт ҳанӯз оғоз нашуда бошад, дар ҳоли иҷро бошад ё анҷом ёфта бошад. Аз ин рӯ, натиҷаи номуайянро бо нокомии қатъӣ як намекунем.

Ба охир расидани муҳлати саҳифаи пардохт низ худ аз худ исбот намекунад, ки пул интиқол наёфтааст. Муваффақияти деррасида бояд аз роҳи барқарорсозӣ коркард шавад ва сиёсати фармоиш муайян кунад, ки хизмат расонда шавад ё маблағ баргардонда шавад.

Refund ва ҳисоббаробаркуниро низ дар як занҷираи хаттӣ бо Payment ҷой намедиҳем. Пардохте, ки маблағаш аллакай ба фурӯшанда гузаронда шудааст, метавонад баъдтар баргардонда шавад.

Дар ин тарҳ ҳолати гирифтани маблағ, давраи баргардонидани пардохт ва давраи ҳисоббаробаркунӣ ҷудоянд. Ҳолати намоишӣ барои корбар аз омезиши онҳо сохта мешавад.

6. Idempotency бояд шартномаи равшан дошта бошад

Фарз кунед, корбар ҳамон тугмаи пардохтро дубора пахш мекунад. Агар ду дархост ба як қарори тиҷоратӣ тааллуқ дошта бошанд, бояд ба ҳамон амалиёт расанд.

POST /v1/payments
Idempotency-Key: order-123-payment-v1

Танҳо калид кофӣ нест. Доираи эътибори он бояд муайян бошад: масалан, tenant, корбар ва навъи амалиёт.

Ҳамчунин изи рақамии параметрҳои муҳими воридотиро нигоҳ медорем, то истифодаи дубораи ҳамон калид бо маблағ ё қабулкунандаи дигар ба conflict оварда расонад.

UNIQUE (scope, idempotency_key)

Ин маҳдудият рақобати ду дархости ҳамзамонро дар пойгоҳи додаҳо идора мекунад. Санҷиши пешакӣ бо SELECT ё гирифтани қулфи муваққатӣ дар Redis ҷойи онро намегирад.

Сабти idempotency бояд ҳолати «дар ҳоли иҷро»-ро низ бишносад. Агар дархости дуюм пеш аз анҷоми аввалӣ расад, ҷавоби пурраи сохта барнамегардонем. Шартномаи API метавонад ҳамон resource ва ҳолати ҷории онро диҳад ё ҷавоби мушаххаси «дар ҳоли коркард» дошта бошад.

Барои амалиёти маҳаллӣ сабти калид ва таъсири молиявӣ бояд дар ҳамон транзаксия анҷом шаванд. Барои тамоси беруна аввал attempt-и пойдор сохта мешавад ва натиҷаи тамос баъдтар ба ҳамон attempt бармегардад.

Муҳлати нигоҳдории калид низ бояд ба давраи retry мувофиқ бошад. Ҳазфи бармаҳали он метавонад кӯшиши кӯҳнаро дубора иҷрошаванда кунад.

Idempotency дар сатҳи API бо ягонагии амалиёти молиявӣ як чиз нест. Ҳатто агар муштарии API калиди нав созад, қоидаи тиҷоратӣ бояд гирифтани дубораи ғайримуҷози маблағро барои ҳамон фармоиш пешгирӣ кунад.

Барои reference-и даргоҳ ва амалиёти Ledger низ маҳдудияти мустақили ягонагӣ лозим аст.

Ҳуҷҷатҳои «Idempotent requests»-и Stripe намунаи таърифи дақиқи ин шартнома мебошанд. Рафтори нигоҳдории калид ва ҷавоб дар провайдерҳои дигар бояд алоҳида санҷида шавад.

7. Callback хабар медиҳад; тасдиқи молиявӣ далели эътиборнок мехоҳад

Бозгашти браузер аз даргоҳ барои роҳнамоии корбар муфид аст, аммо далели кофии муваффақияти пардохт нест. Корбар метавонад tab-ро бандад, redirect нарасад ё параметрҳои callback тағйир дода шаванд.

Даргоҳҳо усулҳои гуногун доранд. Агар Webhook-и имзошуда пешниҳод шавад, имзо бояд мувофиқи ҳуҷҷатҳои провайдер ва дар асоси муҳтавои пешбиникардаи ӯ санҷида шавад.

Агар шартнома verify ё inquiry-и сервериро талаб кунад, ҳамон роҳ иҷро мешавад. Набудани имзо дар як провайдер маънои бовар кардан ба додаҳои браузерро надорад.

Дар ҳар ду ҳолат reference, маблағ, асъор ва ҳисоби қабулкунанда бояд бо attempt-и дохилӣ мувофиқ бошанд.

Барои Webhook-и эътиборнок роҳи қабулро кӯтоҳ нигоҳ медорем: санҷиш, нигоҳдории пойдор дар Inbox ва баъд ҷавоби муносиб. Коркарди вазнини молиявӣ баъдтар анҷом мешавад. Агар нигоҳдорӣ ноком шуд, набояд ба провайдер вонамуд кунем, ки паёмро қабул кардаем.

Дар ҳуҷҷатҳои Webhook-и Stripe низ расидани такрорӣ ва бетартиби рӯйдодҳо зикр шудааст. Аз ин рӯ, тартиби расидани паёмҳоро ҷойгузини қоидаҳои мошини ҳолатҳо намекунем.

Ду фарқи муҳим вуҷуд дорад:

  • received маънои онро дорад, ки паёмро дорем; processed маънои онро дорад, ки таъсири он бомуваффақият сабт шудааст.
  • Ягонагии event бо ягонагии таъсири молиявӣ фарқ мекунад. Ду event-и гуногун метавонанд аз як capture хабар диҳанд.

Барои якум шиносаи рӯйдод дар доираи дурусти провайдер ва ҳисоби қабулкунанда ягона мешавад. Барои дуюм reference-и амалиёти беруна ва ҳувияти сабти Ledger ҳифзи мустақил доранд.

Рӯйдоди эътиборнок бо reference-и ношинос низ дар навбати баррасӣ нигоҳ дошта мешавад. Аз рӯйи он худкор пардохти нав намесозем.

8. Ҳамёни электронӣ танҳо як рақам нест

Фарз кунем, корбар як миллион сомон бақияи сабтшуда дорад ва 200 ҳазор сомони он барои гирифтани маблағ банд шудааст. Ҳамзамон, пуркунии дигаре ба маблағи 150 ҳазор сомон ҳанӯз тасдиқи ниҳоӣ нагирифтааст.

Дар ин тарҳ:

  • Бақияи сабтшуда — posted_balance: 1 000 000 сомон.
  • Маблағи фаъоли бандшуда — active holds: 200 000 сомон.
  • Бақияи қобили харҷ — available_balance: 800 000 сомон.
  • Воридоти интизорӣ — pending_incoming: 150 000 сомон.

Маблағи pending ҳанӯз қобили харҷ нест. Бандкунии маблағ низ бояд бо амалиёти мушаххас, ҳолат ва роҳи озодсозӣ алоқаманд бошад.

Тағйири дастии сутуни reserved_balance бе сабти hold имкони шарҳ додан ва барқарорсозиро аз байн мебарад.

Модели дақиқ метавонад фарқ кунад. Дар ин мақола posted_balance аз сабтҳои ниҳоии Ledger гирифта мешавад, hold-ҳои фаъол ҷудо нигоҳ дошта мешаванд ва бақияи қобили харҷ аз омезиши онҳо ва маҳдудиятҳои соҳа ҳисоб мешавад.

Ин таъриф бояд дар API, пойгоҳи додаҳо ва абзори дастгирӣ яксон бошад. Агар ҳар даста «бақия»-ро ба тарзи дигар фаҳмад, ҳатто рақами зоҳиран дуруст метавонад ба қарори хато оварда расонад.

9. Ledger: шарҳи пойдори ҳаракати пул

Дафтари кулл ба се мафҳуми асосӣ ниёз дорад:

  • Account: ҳисоб бо навъ ва асъори мушаххас.
  • Ledger Transaction: гурӯҳбандии як сабти ягонаи молиявӣ.
  • Ledger Entry: таъсири он сабт ба як ҳисоб.

Дар баҳисобгирии дутарафа маблағи умумии дебет ва кредит барои ҳар транзаксия ва ҳар асъор бояд баробар бошад. Аммо дебет ҳамеша маънои кам шудани бақияро надорад; таъсири он ба навъи ҳисоб вобаста аст.

Аз назари платформа бақияи ҳамёни корбар одатан уҳдадории платформа дар назди корбар аст. Ҳисоби дороии бонкӣ табиати дигар дорад. Намунаи Digital Wallet дар Modern Treasury ҳамин фарқи ҳисобҳои дороӣ ва уҳдадориро нишон медиҳад.

Масалан, корбар аз ҳамёнаш ба маблағи як миллион сомон харид мекунад ва ҳаққи хизматрасонии платформа 20 ҳазор сомон аст. Дар модели содаи мақола сабт чунин мешавад:

  • Ҳисоби уҳдадории ҳамёни корбар: дебет — 1 000 000 сомон.
  • Ҳисоби маблағи пардохтшаванда ба фурӯшанда: кредит — 980 000 сомон.
  • Ҳисоби даромади ҳаққи хизматрасонии платформа: кредит — 20 000 сомон.
  • Ҷамъи дебет: 1 000 000 сомон.
  • Ҷамъи кредит: 1 000 000 сомон.

Уҳдадории мо дар назди корбар кам, уҳдадорӣ дар назди фурӯшанда зиёд ва ҳаққи хизматрасонӣ ҷудогона сабт шудааст.

Ин мисол андоз, захираҳо ва шартномаҳои мураккабро дар бар намегирад. Ҳисобҳо ва вақти эътирофи даромад бояд ба модели воқеии молиявии маҳсулот мувофиқ бошанд.

Пур кардани ҳамён сабти дигар дорад: зиёд шудани дороӣ ё маблағи талабшаванда аз даргоҳ дар муқобили зиёд шудани уҳдадорӣ дар назди корбар.

Аз ин рӯ, набояд як қолаби аломатҳои мусбат ва манфиро бе таваҷҷуҳ ба навъи ҳисоб ба ҳамаи амалиётҳо татбиқ кунем.

Тавозун зарур аст, аммо кофӣ нест. Транзаксияе, ки ҳисоби нодурустро бо маблағи нодуруст дебет ва кредит мекунад, метавонад ҳамоно мутавозин бошад. Дар баробари тавозун маблағ, моликияти ҳисоб, асъор ва reference-и тиҷоратӣ низ санҷида мешаванд.

10. Додаҳои молиявӣ бояд қобили бозсозӣ бошанд

Ҳастаи модели додаҳоро метавон чунин нишон дод:

ledger_accounts
  id, owner_id, account_type, currency, status

ledger_transactions
  id, operation_id, posting_type, occurred_at, posted_at

ledger_entries
  id, transaction_id, account_id, direction, amount

account_balances
  account_id, posted_balance, reserved_balance, version

wallet_holds
  id, account_id, operation_id, amount, status, expires_at

Дар паҳлуи ин ҳаста ҷадвалҳои пардохт, attempt, баргардонидани пардохт, гирифтани маблағ, ҳисоббаробаркунӣ, Inbox, Outbox ва парвандаҳои мувофиқсозӣ ҷой мегиранд.

Ҳар сабти молиявӣ бояд ба амалиёти муайян пайваст шавад ва ҳар account дар як асъор муайян гардад.

Маблағро бо адади бутун дар воҳиди асосӣ ё навъи дақиқи даҳӣ, мисли NUMERIC, нигоҳ медорем. Дар ин тарҳ нигоҳдорӣ ва мубодилаи дохилӣ бо риёл ва currency = IRR анҷом мешавад. Сомон танҳо дар мисолҳои матнӣ ва намоиш ба корбар истифода мешавад. Табдили воҳид бояд дар марзи муайян ва танҳо як бор анҷом ёбад.

Сабтҳои Ledger пас аз ниҳоӣ шудан тағйирнопазиранд. Хато бо транзаксияи ҷубронкунанда ислоҳ мешавад ва reference-и сабти пешина нигоҳ дошта мешавад.

Маҳдуд кардани UPDATE ва DELETE дар роҳи барнома, назорати дастрасии маъмурӣ ва сабти амалҳои дастгирӣ ин принсипро ҳифз мекунанд.

Тавозуни чанд Entry-ро бо як CHECK-и сода дар сатҳи ҳар сатр кафолат додан мумкин нест. Роҳи posting бояд ягона роҳи сабти ниҳоӣ бошад ва тавозун, навъи ҳисобҳо ва ягонагии амалиётро дар марзи транзаксия санҷад.

Вобаста ба татбиқ, ин назорат бо routine-и пойгоҳи додаҳо ё constraint trigger-и муносиб ва дастрасии маҳдуд тақвият дода мешавад.

11. Бақия як projection аст, аммо projection-и ҳассос

Ҳисоб кардани тамоми таърих барои ҳар дархости бақия дар ҳисобҳои сербор гарон мешавад. Аз ин рӯ, натиҷаи пешакӣ ҳисобшударо нигоҳ медорем, то хондан ва назорати харҷ зуд бошад.

Барои бақияи қобили харҷ навсозии projection-ро ба consumer-е бо таъхири номуайян намесупорем. Сабти Ledger, тағйири бақияи марбут ва тағйири hold дар як транзаксияи маҳаллӣ анҷом мешаванд.

Ҳисоботи таҳлилӣ метавонад дертар нав шавад. Иҷозати харҷ наметавонад аз ҳамин шартнома истифода кунад.

Агар ихтилоф пайдо шуд, бозсозӣ танҳо ҷамъ кардани Ledger нест. Бақияи posted аз дафтари кулл бозсозӣ мешавад, аммо hold-ҳои фаъол ва маҳдудиятҳои ҳисоб низ бояд дар ҳисоб кардани available ба назар гирифта шаванд.

Барқарорсозӣ бояд дар асоси snapshot-и ҳамоҳанг анҷом шавад. Ё навиштан ба ҳисоб муваққатан боздошта мешавад, ё раванди бозсозӣ бо version ва watermark-и муайян тағйироти ҳамзамонро фаро мегирад.

Аз нав навиштани projection бо натиҷаи ҳисобкунии кӯҳна метавонад ҳамон хатоеро ба вуҷуд орад, ки мехостем ислоҳ кунем.

12. Ду дархости ҳамзамон ва як бақияи муштарак

Корбар 100 ҳазор сомон дорад. Дархости аввал мехоҳад 80 ҳазор ва дархости дуюм 70 ҳазор сомон харҷ кунад. Агар ҳар ду бақияи аввалияро хонанд, ҳар ду метавонанд иҷозатдодашуда ба назар расанд.

Масъала бо хондани бақия ва баъд иҷрои save() ҳал намешавад. Санҷиш ва тағйир бояд зери як механизми назорати ҳамзамонӣ анҷом шаванд.

Як роҳ қулф кардани сатр бо SELECT ... FOR UPDATE аст. Роҳи дигар навсозии шартӣ мебошад:

UPDATE account_balances
SET posted_balance = posted_balance - :amount,
    version = version + 1
WHERE account_id = :account_id
  AND :amount > 0
  AND posted_balance - reserved_balance >= :amount
RETURNING posted_balance, reserved_balance, version;

Ин порча танҳо шарти бақияро барои харҷи мустақим нишон медиҳад. Он ба танҳоӣ татбиқи интиқол нест.

Ягонагии амалиёт, сабти мутавозини Ledger, тағйири ҳисоби муқобил ва Outbox бояд дар ҳамон транзаксия анҷом шаванд. Нокомии ҳар қисм ҳамаи тағйиротро rollback мекунад.

Ҳангоми интиқол байни ду ҳамён ҳисобҳоро бо тартиби доимӣ, масалан аз рӯйи шиноса, қулф мекунем, то хатари deadlock кам шавад.

Худи deadlock ва serialization failure низ бояд бо retry-и маҳдуди тамоми транзаксия ва ҳамон ҳувияти амалиёт идора шаванд. Рафтори қулфҳои сатрӣ дар ҳуҷҷатҳои PostgreSQL шарҳ дода шудааст.

Optimistic locking барои рақобати кам муфид аст, аммо дар ҳисоби бисёр сербор метавонад retry-и зиёд ба вуҷуд орад. Сатҳи SERIALIZABLE низ барои инвариантҳои мураккаб муносиб буда метавонад, вале зарурати коркарди serialization failure-ро бартараф намекунад.

13. Бандкунӣ, гирифтани маблағ ва харҷи ниҳоиро ҷудо кунем

Гирифтани маблағ аз ҳамён амалиёти беруна аст. Наметавонем бақияро то омадани натиҷаи бонк озод монем, зеро корбар метавонад ҳамон маблағро дар ҷойи дигар харҷ кунад.

Аввал маблағ дар hold-и пойдор банд мешавад. Сохтани hold, санҷиши бақия ва тағйири projection дар дохили транзаксия анҷом меёбанд.

Сипас дархости интиқол бо reference-и собит ва берун аз қулфи пойгоҳи додаҳо ба провайдер фиристода мешавад.

Агар муваффақият тасдиқ шуд, hold истифода шуда, сабти ниҳоии молиявӣ анҷом меёбад. Агар нокомӣ қатъӣ буд, hold озод мешавад. Дар натиҷаи номуайян маблағ банд мемонад, то inquiry ё баррасии амалиётӣ ҳолатро равшан кунад.

Ба охир расидани муҳлати hold худ аз худ иҷозати озод кардани пулеро намедиҳад, ки шояд интиқолаш муваффақ шудааст. Аз ин рӯ, вазифаи худкори коркарди муҳлат бояд ҳолати attempt-и беруниро ба назар гирад.

Timer барои пайдо кардани амалиёти дармонда муфид аст, аммо ҷойи далели натиҷаи интиқолро намегирад.

14. Марзи транзаксия ҷойест, ки дурустиро ҳифз мекунем

Фарз кунем, далели эътиборноки capture гирифта шудааст ва ҳоло бояд натиҷаро дар дохили низом сабт кунем.

Тартиби умумӣ чунин аст:

BEGIN
  сабти ҳаққи иҷрои амалиёт / санҷиши натиҷаи пешина
  қулф кардани пардохт ва сатрҳои бақияи марбут
  санҷиши далел, маблағ, асъор ва гузариши ҳолат
  сабти транзаксияи мутавозини дафтари кулл
  навсозии projection-ҳои бақия
  навсозии ҳолати пардохт
  қайд кардани вуруд ҳамчун коркардшуда
  илова кардани рӯйдод ба Outbox
COMMIT

Ин псевдокод марзи атомиро нишон медиҳад. Далеле, ки пештар аз провайдер гирифтаем, ҳангоми сабт бо ҳолати ҷорӣ дубора муқоиса мешавад, то worker-и кӯҳна қарори номувофиқро татбиқ карда натавонад.

Тамос бо даргоҳ, бонк, брокер ё хизматрасонии SMS-ро дар дохили ин транзаксия нигоҳ намедорем. Қатъи иртиботи беруна набояд қулфҳои молиявиро барои чанд сония ё дақиқа банд кунад.

Агар натиҷаи худи COMMIT низ аз сабаби қатъи пайвастшавӣ номуайян шуд, фарз намекунем, ки rollback рух додааст. Амалиётро бо шиносаи пойдораш ҷустуҷӯ мекунем ва retry аз ҳамон шартномаи idempotency мегузарад.

15. Outbox ва Inbox ду фосилаи гуногунро мепӯшонанд

Пас аз commit бояд хабари пардохтро ба сервисҳои дигар расонем. Агар аввал пойгоҳи додаҳоро тағйир диҳем ва баъд паём нашр кунем, crash байни ин ду амал метавонад паёмро гум кунад.

Outbox нияти нашрро ҳамроҳи тағйири молиявӣ дар ҳамон транзаксия сабт мекунад. Dispatcher баъдтар паёмро мефиристад ва пас аз тасдиқи брокер онро нашршуда қайд мекунад.

Аммо агар фиристодан муваффақ шавад ва Dispatcher пеш аз сабти ин қайд crash кунад, паём дубора нашр мешавад. Пас Outbox ба танҳоӣ расонидани якдафъаинаро таъмин намекунад. Ин рафтор дар шарҳи Transactional Outbox низ зикр шудааст.

Дар тарафи consumer шиносаи паём ва таъсири маҳаллии он дар як транзаксия сабт мешаванд. Барои consumer-ҳои мустақил метавон шиносаи таркибиро истифода бурд:

UNIQUE (consumer_name, message_id)

Агар consumer пас аз commit ва пеш аз ack аз дастрасӣ барояд, иҷрои баъдӣ сабти пешинаро мебинад.

Аммо агар таъсири асосӣ тамос бо сервиси беруна бошад, Inbox-и маҳаллӣ ба танҳоӣ кофӣ нест. Он тамос низ ба attempt-и пойдор, idempotency ё inquiry ниёз дорад.

Ҳадафи амалӣ татбиқи якдафъаинаи таъсири молиявӣ дар марзест, ки назораташро дорем. Код метавонад чанд бор иҷро шавад ва паём чанд бор расад. Ин фарқ бояд дар тарҳ ва иддаоҳои марбут ба exactly-once равшан бошад.

16. Баргардонидани қисмии пардохт рақобати пинҳонӣ дорад

Фарз кунем, барои пардохти якмиллионтуманӣ ҳамзамон ду дархости баргардонидани 600 ҳазор сомон мерасад.

Агар танҳо ҷамъи refund-ҳои муваффақро санҷем, ҳар ду қабул шуда метавонанд, зеро ҳанӯз ҳеҷ кадом муваффақ нашудааст.

Аз ин рӯ, иқтидори баргардонидани маблағ танҳо аз натиҷаҳои ниҳоӣ ҳисоб намешавад. Дархостҳои қабулшуда ва ҳалношуда низ уҳдадорӣ ба вуҷуд овардаанд:

successful_refunds + reserved_nonfinal_refunds
    <= refundable_limit

Ҳар refund маҳз ба яке аз ин ду гурӯҳ дохил мешавад. Як маблағро ҳамзамон дар ҳар ду ҷамъ намекунем. refundable_limit низ аз capture-и эътиборнок ва қоидаҳои маҳсулот гирифта мешавад.

Дар транзаксияи маҳаллӣ Payment-ро қулф мекунем, иқтидорро месанҷем, маблағи refund-ро банд мекунем ва фармони беруниро ба таври пойдор сабт менамоем. Тамос бо провайдер пас аз commit анҷом мешавад.

Натиҷаи муваффақ сабти нави ҷубронкунанда месозад. Нокомии қатъӣ маблағи бандшударо озод мекунад. Timeout ҳолати refund-ро ба UNKNOWN ё RECONCILING мебарад ва маблағро то равшан шудани натиҷа банд нигоҳ медорад.

Агар маблағ аллакай ба фурӯшанда гузаронда шуда бошад, refund метавонад аз захира, маблағи минбаъдаи пардохтшаванда ё талабот аз фурӯшанда таъмин шавад.

Ин қарор сиёсати равшани молиявӣ мехоҳад. Тағйири пинҳонии таърихи ҳисоббаробаркунӣ роҳи ҳал нест.

Reversal, бекор кардани authorization ва Refund низ дар ҳамаи провайдерҳо маънои яксон надоранд. Озод кардани иҷозати пардохте, ки capture нашудааст, бо баргардонидани маблағи гирифташуда ду ҷараёни гуногунанд. Adapter бояд фарқи шартномаҳоро нигоҳ дорад.

17. Ҳисоббаробаркунӣ интихоби дақиқи пулест, ки ҳанӯз пардохт нашудааст

Фарз кунем, фурӯшанда 100 миллион сомон фурӯш, 5 миллион сомон баргардонидани пардохт ва 2 миллион сомон ҳаққи хизматрасонӣ дорад. Дар модели сода маблағи пардохтшаванда 93 миллион сомон аст.

Аммо танҳо ин рақам барои сохтани интиқоли бонкӣ кофӣ нест.

Бояд бидонем, ки кадом ҷузъҳо қобили ҳисоббаробаркунӣ ҳастанд, кадомашон пештар пардохт шудаанд ва кадом маблағҳо бо сабаби бандкунӣ ё баҳси молиявӣ муваққатан канор гузошта шудаанд.

Ҳисобкунӣ низ набояд ҳаққи хизматрасониеро, ки пештар аз payable кам шудааст, дубора тарҳ кунад.

Дар ин тарҳ batch аз ҷузъҳои мушаххас сохта мешавад. settlement_items ҳар ҷузъро ба batch-и марбут мепайвандад ва маҳдудияти пойгоҳи додаҳо ҷудо кардани дубораи ҳамон ҷузъро пешгирӣ мекунад.

Маблағ ва муҳтавои batch пас аз тасдиқ дигар тағйир дода намешаванд.

CALCULATED → APPROVED → TRANSFER_REQUESTED → PROCESSING

Аз PROCESSING:
  → PAID
  → FAILED_CONFIRMED
  → UNKNOWN

Ҷавоби «дархост қабул шуд» аз бонк ҳатман маънои интиқоли ниҳоиро надорад.

Ҳангоми натиҷаи номуайян пеш аз фиристодани дубораи интиқол бо ҳамон reference ҳолатро мепурсем. Агар провайдер имкони муайян кардани бехатари натиҷаро надошта бошад, парванда ба баррасии амалиётӣ мегузарад.

Ҳисоббаробаркунӣ бояд аз ҷузъҳои мувофиқи дафтари кулл ва тақсимоти пойдор сохта шавад, на аз query-и тағйирёбандае, ки ҳар бор барои ҳамон batch натиҷаи дигар медиҳад.

18. Reconciliation: роҳи ёфтани воқеият пас аз пайдо шудани ихтилоф

Ба корбари аввали мақола баргардем. Даргоҳ пардохтро муваффақ медонад, аммо Payment-и дохилӣ ҳанӯз UNKNOWNаст. То абад интизори Webhook мондан роҳи барқарорсозӣ нест.

Reconciliation ҳолати дохилиро бо inquiry, ҳисоботи провайдер ва дар ҳолати зарурӣ ҳисоботи бонкӣ муқоиса мекунад. Баъзе санҷишҳо пайвастаанд, баъзеи дигар ба вақти омода шудани файлҳои ҳисоббаробаркунӣ вобастаанд.

Намунаҳои ихтилоф:

  • Пардохти беруна бе сабти дохилӣ.
  • Номувофиқии маблағ.
  • Refund-и ҳалношуда.
  • Интиқоли бонкӣ бе тасдиқи ниҳоӣ.
  • Ихтилофи projection бо Ledger.

Ҳамаи ин ҳолатҳо як сабаб ва як роҳи ҳал надоранд.

Барои ҳар ихтилоф парвандаи пойдор месозем:

internal_reference, external_reference
expected_amount, observed_amount, currency
discrepancy_type, evidence_reference
status, first_seen_at, last_checked_at
resolution, resolved_by, resolved_at

Агар муваффақияти беруна тасдиқ шуда бошад, ҳувият ва маблағ комилан мувофиқ бошанд ва таъсири дохилӣ вуҷуд надошта бошад, барқарорсозӣ аз ҳамон фармони назоратшавандаи posting мегузарад.

Роҳи мувофиқсозӣ набояд роҳи дуюме барои давр задани инвариантҳо созад.

Ихтилофи маблағ, reference-и ношинос ё далелҳои зиддиятнок ба review мераванд. Оператор бояд сабаб, далелҳо ва амали иҷозатдодашударо бинад.

Агар ислоҳ зарур бошад, сабти ҷубронкунанда бо reference-и парванда сохта мешавад. Сатри пешинаи дафтари кулл тағйир дода намешавад.

19. Saga дар куҷо кумак мекунад?

Фармоиш, захираи мол, даргоҳ ва бонк одатан дар як пойгоҳи додаҳо нестанд. Дар ин марзҳо ба workflow ниёз дорем.

Масалан: банд кардани мол, гирифтани иҷозати пардохт, тасдиқи фармоиш ва capture — албатта, танҳо агар провайдер чунин имкониятҳо дошта бошад.

Агар як марҳила ноком шавад, амали мувофиқи ҷубронкунанда лозим аст. Он ҳамеша rollback-и фаврӣ нест. Озод кардани захира, бекор кардани authorization ё refund метавонад вақт гирад ё худаш ба ҳолати номуайян расад.

Saga ҳамин марҳилаҳо ва амалҳои ҷубронкунандаро ҳамоҳанг мекунад.

Аммо сабти Ledger ва тағйири бақияро дар дохили як PostgreSQL бе зарурат ба чанд марҳилаи асинхронӣ ҷудо намекунем. Дар он ҷо транзаксияи маҳаллӣ ҳамоно абзори муносиб аст.

Муҳаррики workflow барои гирифтани маблағ, refund ё ҳисоббаробаркунии тӯлонӣ метавонад timer, retry ва ҳолати пойдорро идора кунад.

Бо вуҷуди ин, иҷрои дубораи activity бояд бехатар бошад. Доштани муҳаррики workflow тамоси бонкии такрорнопазирро худкор idempotent намекунад.

20. Ҳамон пардохт, ин бор бо crash ва паёми такрорӣ

Акнун бубинем, ки ҷузъҳои тарҳ дар сенарияи аввал чӣ гуна якҷоя кор мекунанд.

Timeout ба ҳолати номуайян мерасонад. Пурсиши ҳолат далели беруниро равшан мекунад ва муваффақияти тасдиқшуда аз роҳи сабти ягонаи дохилӣ мегузарад. Натиҷаи номуайян ба retry-и кӯр-кӯрона табдил намеёбад.

  1. Пеш аз тамос бо даргоҳ Intent ва attempt-и пойдор сохта шудаанд. Пас дархости беҳувият надорем.
  2. Ҷавоби даргоҳ гум мешавад. Attempt номуайян мемонад ва корбар ба саҳифаи пайгирии ҳамон Payment бармегардад.
  3. Рӯйдоди эътиборнок мерасад ва дар Inbox нигоҳ дошта мешавад. Processor далелҳоро бо пардохт муқоиса мекунад.
  4. Ledger, бақияи марбут, ҳолати Payment ва Outbox якҷоя commit мешаванд. Worker пеш аз ack аз дастрасӣ мебарояд.
  5. Паём дубора мерасад. Inbox ва ҳувияти мустақили сабти молиявӣ таъсири такрориро пешгирӣ мекунанд.
  6. Kafka муваққатан дастнорас аст. Outbox мемонад, то Dispatcher баъдтар паёмро нашр кунад. Агар нашр такрор шавад, consumer-ҳо низ бояд онро таҳаммул кунанд.
  7. Reconciliation натиҷаи даргоҳ, Payment ва сабти Ledger-ро муқоиса мекунад. SMS-и номуваффақ метавонад алоҳида retry шавад; муваффақияти молиявӣ ба муваффақияти SMS вобаста нест.

Ин ҷараён кафолат намедиҳад, ки ҳеҷ вайронӣ рӯй намедиҳад. Кафолати ҳадаф ин аст, ки таъсири молиявӣ дар марзи муайян ҳифз шавад ва кори боқимонда ҳувият, ҳолат ва роҳи барқарорсозӣ дошта бошад.

21. Ҳар вайронӣ бояд ба амали мушаххас расонад

Чанд сенарияи дигар тарҳро дақиқтар мекунанд:

  • Пойгоҳи додаҳо ҳангоми commit қатъ мешавад: натиҷаро бо шиносаи амалиёт месанҷем. Қатъи пайвастшавиро ҳаммаънои rollback намедонем.
  • Ledger навишта мешавад, аммо навсозии бақия хато медиҳад: азбаски ҳар ду дар як транзаксияанд, ҳеҷ кадом алоҳида commit намешавад.
  • Event-и кӯҳна пас аз муваффақият мерасад: онро бо қоидаҳои гузариши ҳолат ва далели провайдер месанҷем. Ҳолати муваффақро танҳо аз рӯйи тартиби расидани паёмҳо аз нав наменависем.
  • Даргоҳ refund-ро иҷро кардааст, аммо ҷавоб нарасидааст: маблағи refund банд мемонад ва inquiry бо reference-и пешина идома меёбад.
  • Outbox ақиб мондааст: синни кӯҳнатарин паёми нашрнашуда чен мешавад. Агар backlog иқтидори нигоҳдорӣ ё муҳлати қобили қабулро таҳдид кунад, маҳдуд кардани дархостҳои воридотӣ қисми вокуниши амалиётӣ мешавад.
  • Оператор дархости ислоҳи хато медиҳад: нақши иҷозатдодашуда, сабаб, reference ва барои амалҳои ҳассос тасдиқи дуюм лозим аст. Абзори дастгирӣ ҳаққи тағйири мустақими сабтҳои ниҳоиро надорад.

Санҷиш танҳо happy path нест. Бояд дархостҳои ҳамзамон бо калиди яксон, refund-ҳои ҳамзамон, crash пеш ва пас аз commit, паёмҳои такрорӣ, ҷавобҳои деррасида ва failover санҷида шаванд.

Инҳо меъёрҳои пешниҳодии арзёбии тарҳанд. Кодҳои мақола татбиқи пурра ё санҷидашудаи як маҳсулот нестанд.

22. Амният ва қаллобӣ: бо масъулиятҳои равшан

Authorization бояд дар ҳар амалиёт санҷида шавад. Доштани payment_id набояд ба корбари дигар иҷозати дидани пардохтро диҳад. Фурӯшанда низ набояд ба ҳисоббаробаркунии фурӯшандаи дигар дастрасӣ дошта бошад.

Роҳи гирифтани маълумоти кортро то ҳадди имкон ба провайдери боэътимод месупорем ва танҳо token ё reference-и заруриро нигоҳ медорем.

Ин интихоб ба танҳоӣ исботи мутобиқат ба талаботи пардохт нест. Доираи талабот ба ҷараёни воқеии додаҳо ва шартномаҳо вобаста аст.

Калидҳои даргоҳ бояд бо дастрасии маҳдуд, ивазкунии даврӣ ва механизми идоракунии secrets нигоҳ дошта шаванд.

Додаҳои ҳассос набояд ба log, payload-и рӯйдодҳои умумӣ ё натиҷаи абзори дастгирӣ ворид шаванд. Нигоҳдории Webhook ва ҳисоботи хом низ ба кам кардани ҳаҷми додаҳо, назорати дастрасӣ ва муҳлати муайяни нигоҳдорӣ ниёз дорад.

Барои пешгирии сӯиистифода эҷоди пардохт, интиқол ва гирифтани маблағ маҳдудиятҳои муносиб мехоҳанд.

Дар Webhook низ назорати вуруд зарур аст, аммо маҳдудсозӣ бояд ба шакли retry-и провайдер мувофиқ бошад, то рӯйдодҳои эътиборнокро ба таври васеъ аз даст надиҳем.

Risk engine метавонад барои гардиши босуръати пуркунӣ ва гирифтани маблағ, қабулкунандаи шубҳанок ё нишонаҳои тасарруфи ҳисоб қарори REVIEW, санҷиши иловагии ҳувият ё таъхири гирифтани маблағро диҳад.

Аммо қарори хавф иҷозати вайрон кардани инвариантҳои Ledger нест. Ҳатто банд кардани маблағ бояд ҳолат ва сабаби пайгиришаванда дошта бошад.

23. Дастаи амалиёт бояд бидонад, ки чӣ чиз дар хатар аст

Диаграммаи CPU барои ташхиси хато муфид аст, аммо ба танҳоӣ вазъи молиявиро нишон намедиҳад.

Даста бояд бидонад, ки чанд корбар мунтазири натиҷаанд, чӣ қадар маблағ дар ҳолати номуайян аст ва кадом провайдер бештар таъхир эҷод кардааст.

Нишондиҳандаҳои муҳими ин тарҳ:

  • Шумора, маблағ ва синни Payment, Refund ва Withdrawal-ҳои номуайян.
  • Ихтилофҳои Reconciliation аз рӯйи сабаб ва провайдер.
  • Вайроншавии инвариантҳои Ledger ва ихтилофи projection.
  • Синни кӯҳнатарин Inbox-и коркарднашуда ва Outbox-и нашрнашуда.
  • Басомади timeout ва хатои verify-и даргоҳ.
  • Интизории қулф, deadlock ва ихтилофҳои бақия.
  • Ҷузъҳои ҳисоббаробаркуние, ки аз муҳлати интизоршаванда гузаштаанд.

Огоҳӣ бояд ба амали мушаххас роҳнамоӣ кунад. «Пардохтҳои зиёда аз даҳ дақиқа номуайян бо маблағи рӯ ба афзоиши дар хатар» масъалаи равшантареро нишон медиҳад, назар ба «шумораи хатоҳо зиёд шуд».

Ҳадди огоҳӣ низ бояд аз рӯйи рафтори провайдер ва ҳассосияти амалиёт муайян шавад.

Application log барои ташхиси хатои иҷро аст. Audit trail барои шарҳи амали молиявӣ ва шахси масъули он мебошад.

Як correlation_id метавонад дархост, attempt, рӯйдод ва сабти молиявиро ба ҳам пайвандад, аммо ба танҳоӣ ҷойи таърихи молиявиро намегирад.

Пойдории додаҳо низ ба нусхаи эҳтиётӣ ва барқарорсозии санҷидашуда ниёз дорад. Репликатсияи асинхронӣ метавонад ҳангоми failover навиштҳои охиринро аз даст диҳад.

Аз ин рӯ, иддаои пойдорӣ бояд ба танзимоти воқеӣ, модели вайронӣ, RPO/RTO ва машқи барқарорсозӣ мувофиқ бошад.

24. Рушди низом аз ченкунӣ оғоз мешавад

Пеш аз sharding query-ҳои воқеӣ, индексҳо, давомнокии транзаксияҳо, connection pooling ва ҳисобҳои серборро месанҷем.

Таърихи корбар, ҷустуҷӯи reference-и даргоҳ ва хондани Outbox ҳар кадом индексҳои гуногун мехоҳанд.

Read replica барои ҳисобот ва таърих мувофиқ аст, агар таъхири он дар шартномаи хондан қабул шуда бошад. Қарори харҷ ё санҷиши натиҷа фавран пас аз навиштан набояд бе назардошти lag ба реплика фиристода шавад.

Тақсимоти замонии Ledger — partitioning — метавонад нигоҳдорӣ ва бойгониро осон кунад. Аммо query-и таърихи дарози як account метавонад ҳамоно чанд partition-ро бихонад.

Ягонагии reference-ҳои молиявӣ низ бояд ба маҳдудиятҳои сохтори нав мувофиқ монад. Partitioning набояд ҳифз аз сабти такрориро заиф кунад.

Дар Kafka ин шиносаҳо муфиданд:

  • event_id барои пешгирии коркарди такрорӣ.
  • aggregate_id барои ҳувияти мавҷудият.
  • aggregate_version барои муайян кардани тартиби мантиқӣ.
  • correlation_id барои пайгирии ҷараён.

Тартиб дар дохили як partition-ро набояд тартиби умумии тамоми низом донем. Publisher ва consumer низ бояд версияҳо ва тартиби талабкардаи соҳаро риоя кунанд.

Агар рӯзе ҳисобҳо дар shard-ҳои ҷудогона ҷой гиранд, интиқол байни ду ҳисоб дигар ҳамон транзаксияи содаи маҳаллӣ нест. Ба модели нави бандкунӣ, ҳисоби миёнарав, ҳамоҳангсозӣ ва барқарорсозӣ ниёз пайдо мешавад.

Ҳамчунин, мутамарказ кардани тамоми фурӯшҳо дар як ҳисоби марказии даромад метавонад гулӯгоҳ созад. Ҷузъиёти баҳисобгирӣ ва ҷамъбаст бояд ин фишорро ба назар гиранд.

Роҳи пешниҳодии рушд чунин аст: аввал ҳастаи дурусти молиявӣ бо PostgreSQL, Inbox, Outbox ва worker; баъд чанд провайдер, абзорҳои қавитари мувофиқсозӣ ва ҳисоббаробаркунӣ; сипас, дар сурати мавҷудияти фишори ченшуда, ҷудо кардани сервис ё тағйири тақсимоти додаҳо.

25. Шартномаи API бояд ҳолати воқеиро нишон диҳад

API корбарро ба номҳои дохилии мошини ҳолатҳо вобаста намекунад, аммо набояд номуайянии молиявиро низ пинҳон кунад.

Эҷоди дархости гирифтани маблағ бо интиқоли муваффақи пул фарқ дорад.

POST /v1/payments
GET  /v1/payments/{id}
POST /v1/payments/{id}/refunds

GET  /v1/wallets/{id}
GET  /v1/wallets/{id}/transactions
POST /v1/wallets/{id}/transfers
POST /v1/withdrawals

GET  /v1/merchants/{id}/settlements
POST /v1/webhooks/{provider}

Амалиётҳое, ки вазъи молиявиро тағйир медиҳанд, шартномаи idempotency доранд.

Агар endpoint-и тасдиқ лозим бошад, client танҳо дархости санҷиш медиҳад. Ӯ наметавонад худаш ҳолати CAPTURED-ро интихоб кунад.

Ҷавоби бақия метавонад вақт ва версияи додаҳоро низ нишон диҳад:

{
  "posted_balance": 10000000,
  "reserved_balance": 2000000,
  "available_balance": 8000000,
  "pending_incoming": 1500000,
  "currency": "IRR",
  "version": 42,
  "as_of": "2026-09-11T10:00:00Z"
}

Ин намуна ҳамон рақамҳои мисоли ҳамён аст, аммо бо воҳиди нигоҳдории риёл.

Барои интиқоле, ки ҳанӯз санҷида мешавад, ҷавоби қабул шудани дархост бо шиноса ва роҳи пайгирӣ аз эълони бармаҳали муваффақият муносибтар аст.

Хулоса

Корбари аввали мақола як миллион сомон пардохт карда буд ва ҷавоби равшан нагирифта буд.

Тарҳи хуб бояд баъдтар шарҳ дода тавонад, ки он пардохт ба кадом Intent тааллуқ дошт, даргоҳ чӣ далел пешниҳод кард, кадом сабти молиявӣ сохта шуд ва оё маблағ ба фурӯшанда гузаронда ё ба корбар баргардонда шудааст.

Барои расидан ба ин ҷавоб Ledger-и мутавозин ва тағйирнопазир, бақияи қобили бозсозӣ, назорати ҳамзамонӣ, ҳувияти пойдори амалиёт ва ҳолатҳои қобили барқарорсозӣ заруранд.

Outbox ва Inbox фосилаи байни commit ва паёмрасониро идора мекунанд. Reconciliation ихтилофҳоро бо низомҳои беруна пайгирӣ менамояд.

Арзиши ин меъморӣ вақте равшан мешавад, ки ҷавоб гум шудааст, паём дубора расидааст ё Worker аз дастрасӣ баромадааст.

Дар чунин шароит низом бояд ҳанӯз ҳаракати пулро шарҳ дода тавонад ва амали навбатиро бар асоси далел интихоб кунад.

Маҳз ҳамин қобилият маҷмӯи API-ҳои пардохтро ба ҳастаи молиявии боэътимод наздик мекунад.

Мақолаҳои маъмул

Мақола·Зеҳн·1 сол пеш

Ҳар роҳе, ки интихоб мекунӣ

Ҳаёт мисли як ҳавопаймоест, ки ту худат пилот ҳастӣ, на мусофир. Танҳо ту қодирӣ самти ҳаракатро интихоб кунӣ, баландӣ ва суръатро муайян намоӣ. Агар раҳнамоиро ба дигарон супорӣ, хавфи гум кардани роҳи ҳақиқии худ вуҷуд дорад. Дар ҳар як қарор, дар ҳар

4
Мақола·Аиъша·2 сол пеш

Насиҳати Падар

Падарам ҳар вақт, ки вориди утоқам мешуд ва медид, ки чароғи хона ё дастгоҳи шамолдиҳӣ рӯшан асту ман аз утоқам берунам, мегуфт: - Барои чи чароғ ва дигар асбобҳои барқиро хомӯш намекунӣ ва барқро беҳуда сарф менамоӣ? Вақте, ки вориди ҳамом мешуд ва

3
Мақола·Зеҳн·2 сол пеш

Ростгӯи камоли инсонист.

Ростиро набувад ҳеҷ заволе ба миён. Сарв агар хушк шавад боз асо мегардад. Ростию ростгӯӣ ва росткорӣ фазилатҳои хуби инсонианд. Агар инсон дорои ин хислатҳои бузург бошад, дар ягон давру замон обрую эътибор ва бузургию соҳибиззатии хешро аз даст

2

МУҚАДАСОТИ МО

Дар Конститутсияи (Сарқонуни) Ҷумҳурии Тоҷикистон махсус қайд гирифтааст, ки «Рамзҳои давлатии Тоҷикистон Парчам, Нишон ва Суруди Миллӣ аст». Барои ҳар як тоҷикистонӣ Ватан, миллат, забони тоҷикӣ, Парчам, Нишони давлатӣ, Суруди миллӣ муқаддасанд. Мо ба

2