AiHummer
Azərbaycanca
Daxil ol
v1.0.x
{ }Swagger

Çoxkirayəçilik və idempotentlik

v1.0.x · yeniləndi 2026-06-26

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_app roluna 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