Çoxkirayəçilik və idempotentlik
AiHummer çoxkirayəçilidir: bir gateway bir verilənlər bazasından çoxlu iş sahəsinə xidmət edə bilər, eyni zamanda onların məlumatlarını ayrı saxlayır. İki mexanizm bunu təhlükəsiz edir — oxu/yazı təcridi üçün Postgres Row-Level Security (RLS) və təkrar cəhdlərlə dövr bərpasının heç vaxt real-dünya yan-effektini təkrarlamaması üçün idempotentlik təbəqəsi.
Row-Level Security ilə kirayəçi təcridi
Təcrid yalnız tətbiq kodunda deyil, verilənlər bazasında tətbiq olunur. AiHummer
sorğuları RLS siyasətləri tətbiq edilmiş məhdudlaşdırılmış Postgres rolu
(aihummer_app) vasitəsilə işlədir, ona görə də verilənlər bazasının özü aktiv kirayəçiyə aid
olmayan sətirləri rədd edir.
RLS opt-in-dir. Onu gateway-ə məhdudlaşdırılmış rol üçün ikinci bağlantı sətri verməklə aktivləşdirirsiniz:
# 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-native quraşdırmalar üçün quraşdırıcı
AIHUMMER_DB_APP_URL-i avtomatik təyin edir, ona görə də RLS standart tətbiqdə standart olaraq açıqdır. Əgər dəyişən yoxdursa, gateway yalnız sahib hovuzunda işləyir və RLS aktiv deyil.
Kirayəçi-üzrə əhatələmə
Məhdudlaşdırılmış rol daxilində, hər sorğu öz kirayəçisinə əhatələnir: gateway
bağlantıda cari kirayəçi kontekstini təyin edir ki, RLS siyasətləri düzgün iş sahəsinə
qarşı həll olunsun. WHERE tenant_id = … filtrləri hər yerdə əllə yazılmır;
siyasət bunu mərkəzdən tətbiq edir, bu da o deməkdir ki, buraxılmış bir filtr başqa
kirayəçinin sətirlərini sıza bilməz.
Sistem / bypass rejimi
Bəzi iş qanuni olaraq kirayəçilərarasıdır — fon işçiləri, planlaşdırıcılar və bütün instansiya boyunca işləyən saxlama işləri. Bunlar lazım olanı görə bilmələri üçün sistem / bypass rejimində işləyir. Bypass etibarlı daxili işçilər üçün nəzərdə tutulub, sorğu-emalı yolları üçün deyil.
[!WARNING] Miqrasiyalar həmişə sahib hovuzunda işləyir, heç vaxt məhdudlaşdırılmış rol altında deyil. Sahib bağlantısının sxemi dəyişdirmək və RLS siyasətlərini tətbiq etmək imtiyazları var; məhdudlaşdırılmış rolun qəsdən yoxdur. İki bağlantı sətrini fərqli saxlayın və
aihummer_approluna yalnız ehtiyacı olanı verin.
İdempotent yan-effektlər
Bir dövr real-dünya yan-effektləri istehsal edə bilər: poçt göndərmək, kanala mesaj geri göndərmək. Əgər bir dövr təkrar cəhd olunarsa — keçici xəta səbəbindən və ya gateway dövr ortasında yenidən başladığı və bərpa onu yenidən oxuduğu üçün — bu yan-effektlər iki dəfə baş verməməlidir. AiHummer bunu iki əməkdaşlıq edən hissə ilə təmin edir.
Bərpaya-davamlı uçot açarı
Hər yan-effekt bərpaya-davamlı uçot açarına qarşı qeyd olunur: dövrdən determinik şəkildə törədilən bir açar, belə ki, eyni dövrün yenidən oxunması yeni deyil eyni açarı hesablayır. Uçot hansı açarların artıq icra olunduğunu xatırlayır.
Yan-effekt baryeri
Poçt və ya kanal-göndərmə kimi bir effekt icra olunmazdan əvvəl, o, uçotu yoxlayan yan-effekt baryerindən keçir. Əgər bu açar artıq işə düşübsə, baryer qısa-qapanır və effekt keçilir; yoxsa, effekt işləyir və açar təsdiqlənir.
side-effect requested
└─▶ compute resume-stable ledger key
└─▶ barrier: key already committed?
├─ yes ─▶ skip (no double-send)
└─ no ─▶ perform effect ─▶ commit key
Nəticə çatdırılmanın daxili olaraq ən-azı-bir-dəfə olmasına baxmayaraq dəqiq-bir-dəfə xarici davranışdır. Təkrar cəhdlər quruluş etibarilə təhlükəsizdir, bu da dövr bərpasının (bax: Çatdırılma, outbox və bərpa) yarımçıq qalan dövrü müştərinin eyni e-poçtu və ya eyni cavabı iki dəfə almadan yenidən oxumasına imkan verən şeydir.
[!TIP] Bu, AiHummer-in adi təkrarlanmış mesaj riski olmadan zəmanətli çatdırılma və avtomatik dövr bərpası təklif edə bilməsinin səbəbidir — idempotentlik çatdırılma zəmanətlərinin üzərində qurulduğu təməldir.
Növbəti hara
- Dövrü idarə edən işləmə mühiti: Gateway və dövr mühərriki.
- Cavabların necə dəqiq bir dəfə qaytarıldığı: Çatdırılma, outbox və bərpa.