Köp kärendeçilik we idempotentlik
AiHummer köp kärendeçilidir: bir gateway bir maglumat bazasyndan köp iş giňişligine hyzmat edip, olaryň maglumatlaryny aýry saklap bilýär. Iki mehanizm muny howpsuz edýär — okamak/ýazmak izolýasiýasy üçin Postgres Setir Derejeli Howpsuzlyk (RLS) we gaýtalamalar bilen turn dikeldişiniň hakyky-dünýä gapdal täsirini hiç haçan gaýtalamazlygy üçin idempotentlik gatlagy.
Setir Derejeli Howpsuzlyk bilen kärendeçi izolýasiýasy
Izolýasiýa diňe programma kodunda däl, maglumat bazasynda berjaý edilýär. AiHummer
RLS syýasatlary ulanylan çäklendirilen Postgres roly (aihummer_app) arkaly
soraglary işledýär, şonuň üçin maglumat bazasynyň özi işjeň kärendeçä degişli
bolmadyk setirleri ret edýär.
RLS islege göredir. Siz ony gatewaýa çäklendirilen rol üçin ikinji baglanyşyk setirini bermek bilen işjeňleşdirýärsiňiz:
# gateway.env
# Owner pool — runs migrations and privileged maintenance
AIHUMMER_DATABASE_URL=postgres://aihummer:***@localhost:5432/aihummer?sslmode=disable
# Restricted role — activates RLS for normal request traffic
AIHUMMER_DB_APP_URL=postgres://aihummer_app:***@localhost:5432/aihummer?sslmode=disable
[!NOTE] Host-natiw gurnamalar üçin gurnaýjy
AIHUMMER_DB_APP_URL-ny awtomatiki sazlaýar, şonuň üçin RLS standart gurnamada adaty ýagdaýda işjeňdir. Eger üýtgeýji ýok bolsa gateway diňe eýe howuzunda işleýär we RLS işjeň däldir.
Kärendeçi-boýunça çäklendirme
Çäklendirilen rolyň içinde, her sorag öz kärendeçisine çäklendirilýär: gateway
baglanyşykda häzirki kärendeçi kontekstini sazlaýar, şonuň üçin RLS syýasatlary
dogry iş giňişligine garşy çözülýär. WHERE tenant_id = … filtrleri hemme ýerde
el bilen ýazylmaýar; syýasat ony merkezleşdirilen ýagdaýda berjaý edýär, bu bolsa
goýberilen filtriň başga kärendeçiniň setirlerini syzdyryp bilmeýändigini aňladýar.
Sistem / aýlanyp geçiş režimi
Käbir iş kanuny taýdan kärendeçiler arasydyr — bütin instans boýunça işleýän fon işçileri, meýilleşdirijiler we hyzmat işleri. Bular sistem / aýlanyp geçiş režiminde işleýär, şeýdip olar mätäçlik çekýän zatlaryny görüp bilýärler. Aýlanyp geçiş ynamdar içerki işçiler üçin saklanýar, sorag-işleýiş ýollary üçin däl.
[!WARNING] Migrasiýalar elmydama eýe howuzunda işleýär, hiç haçan çäklendirilen rolyň aşagynda däl. Eýe baglanyşygynyň shemany üýtgetmek we RLS syýasatlaryny ulanmak üçin artykmaçlyklary bardyr; çäklendirilen rolyň bolsa bilkastlaýyn ýokdur. Iki baglanyşyk setirini aýry saklaň we
aihummer_approlyna diňe mätäç zadyny beriň.
Idempotent gapdal täsirler
Turn hakyky-dünýä gapdal täsirlerini öndürip biler: poçta ibermek, kanala yzyna habar ýerleşdirmek. Eger turn gaýtalansa — wagtlaýyn ýalňyşlyk sebäpli ýa-da gateway turnyň ortasynda gaýtadan başlap, dikeldiş ony gaýtadan oýnaýandygy üçin — şol gapdal täsirler iki gezek bolmaly däldir. AiHummer muny iki bilelikde işleýän bölek bilen kepillendirýär.
Dikeldişe durnukly defter açary
Her gapdal täsir dikeldişe durnukly defter açaryna garşy ýazylýar: turndan deterministik taýdan alynýan açar, şonuň üçin şol bir turnyň gaýtadan oýnalmagy täzesini däl-de, şol açary hasaplaýar. Defter haýsy açarlaryň eýýäm hereket edilendigini ýadynda saklaýar.
Gapdal täsir päsgelçiligi
Poçta ýa-da kanal-iberme ýaly täsir ýerine ýetirilmezden ozal, ol defteri barlaýan gapdal täsir päsgelçiliginden geçýär. Eger bu açar eýýäm işläpdir bolsa, päsgelçilik gysga zynjyrlaýar we täsir ötürilýär; eger ýok bolsa, täsir işleýär we açar tabşyrylýar.
side-effect requested
└─▶ compute resume-stable ledger key
└─▶ barrier: key already committed?
├─ yes ─▶ skip (no double-send)
└─ no ─▶ perform effect ─▶ commit key
Netije, eltip bermek içerki taýdan iň azyndan bir gezek bolsa-da, dogry-bir-gezek daşky özüni alyp baryşdyr. Gaýtalamalar gurluş boýunça howpsuzdyr, bu bolsa turn dikeldişiniň (serediň Eltip bermek, outbox we dikeldiş) bölünen turny müşderiniň şol bir e-poçtany ýa-da şol bir jogaby iki gezek almazdan gaýtadan oýnap bilmegini üpjün edýän zatdyr.
[!TIP] Şonuň üçin AiHummer adatdaky gaýtalanan habar töwekgelçiligi bolmazdan kepillendirilen eltip bermek we awtomatik turn dikeldişi hödürläp bilýär — idempotentlik eltip bermek kepillikleriniň gurlan binýadydyr.
Indiki ädim
- Turny dolandyrýan rantaým: Gateway we turn hereketlendirijisi.
- Jogaplaryň nähili dogry bir gezek gaýtarylýandygy: Eltip bermek, outbox we dikeldiş.