AiHummer
Հայերեն
Մուտք
v1.0.x
{ }Swagger

Բազմավարձակալություն և իդեմպոտենտություն

v1.0.x · թարմացվել է 2026-06-26

AiHummer-ը բազմավարձակալ է. մեկ gateway-ը կարող է սպասարկել շատ աշխատանքային տարածքներ մեկ տվյալների բազայից՝ պահելով նրանց տվյալները առանձին։ Երկու մեխանիզմ դա անվտանգ են դարձնում — Postgres Row-Level Security (RLS) կարդալ/գրել մեկուսացման համար, և իդեմպոտենտության շերտ, որպեսզի վերափորձերն ու turn-ի վերականգնումը երբեք չկրկնեն իրական աշխարհի կողմնակի էֆեկտը։

Tenant-ի մեկուսացում Row-Level Security-ով

Մեկուսացումը կիրառվում է տվյալների բազայում, ոչ թե միայն հավելվածի կոդում։ AiHummer-ը հարցումներ է աշխատեցնում սահմանափակ Postgres role-ի (aihummer_app) միջոցով, որին կիրառված են RLS քաղաքականություններ, ուստի տվյալների բազան ինքնին մերժում է այն տողերը, որոնք չեն պատկանում ակտիվ tenant-ին։

RLS-ն ընտրովի-միացվող է։ Դուք այն ակտիվացնում եք՝ gateway-ին տալով երկրորդ կապի string սահմանափակ role-ի համար.

# 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 տեղադրումների համար տեղադրիչը սահմանում է AIHUMMER_DB_APP_URL-ը ավտոմատ կերպով, ուստի RLS-ն ստանդարտ տեղակայման մեջ ըստ լռելյայնի միացված է։ Եթե փոփոխականը բացակայում է, gateway-ն աշխատում է միայն owner pool-ի վրա, և RLS-ն ակտիվ չէ։

Ըստ tenant-ի շրջանակավորում

Սահմանափակ role-ի ներսում յուրաքանչյուր հարցում շրջանակավորվում է իր tenant-ով. gateway-ը կապի վրա սահմանում է ընթացիկ tenant-ի համատեքստը, որպեսզի RLS քաղաքականությունները լուծվեն ճիշտ աշխատանքային տարածքի դեմ։ WHERE tenant_id = … ֆիլտրերը ձեռքով գրված չեն ամենուր. քաղաքականությունը կիրառում է դա կենտրոնականորեն, ինչը նշանակում է, որ բաց թողնված ֆիլտրը չի կարող արտահոսել մեկ այլ tenant-ի տողերը։

Համակարգ / bypass ռեժիմ

Որոշ աշխատանք օրինականորեն խաչ-tenant է — ֆոնային worker-ներ, ժամանակացույցեր և սպասարկման աշխատանքներ, որոնք գործում են ամբողջ instance-ի վրայով։ Դրանք աշխատում են համակարգ / bypass ռեժիմում, որպեսզի կարողանան տեսնել այն, ինչ պետք է։ Bypass-ը վերապահված է վստահելի ներքին worker-ների համար, ոչ թե հարցում մշակող ուղիների։

[!WARNING] Migration-ները միշտ աշխատում են owner pool-ի վրա, երբեք սահմանափակ role-ի ներքո։ Owner կապը ունի սխեման փոփոխելու և RLS քաղաքականություններ կիրառելու արտոնություններ. սահմանափակ role-ը դիտավորյալ չունի։ Պահեք երկու կապի string-երը տարբեր և aihummer_app role-ին տվեք միայն այն, ինչ պետք է։

Իդեմպոտենտ կողմնակի էֆեկտներ

Turn-ը կարող է ստեղծել իրական աշխարհի կողմնակի էֆեկտներ. նամակ ուղարկել, հաղորդագրություն հետ տեղադրել ալիք։ Եթե turn-ը վերափորձվում է — անցողիկ սխալի պատճառով, կամ որովհետև gateway-ը վերագործարկվել է turn-ի կեսին, և վերականգնումը այն վերարտադրում է — այդ կողմնակի էֆեկտները չպետք է տեղի ունենան երկու անգամ։ AiHummer-ը երաշխավորում է սա երկու համագործակցող մասով։

Վերսկսման հարցում կայուն ledger key

Յուրաքանչյուր կողմնակի էֆեկտ գրանցվում է վերսկսման հարցում կայուն ledger key-ի դեմ. key, որը դետերմինիստականորեն ստացվում է turn-ից, ուստի նույն turn-ի վերարտադրությունը հաշվարկում է նույն key-ը, այլ ոչ թե նորը։ Ledger-ը հիշում է, թե որ key-երն արդեն գործողության են ենթարկվել։

Կողմնակի էֆեկտի արգելապատնեշ

Նախքան նամակի կամ ալիք-ուղարկման նման էֆեկտ կատարվելը, այն անցնում է կողմնակի էֆեկտի արգելապատնեշով, որը ստուգում է ledger-ը։ Եթե այս key-ն արդեն գործարկվել է, արգելապատնեշը կարճ-միացում է անում, և էֆեկտը բաց է թողնվում. եթե ոչ, էֆեկտն աշխատում է, և key-ը commit-վում է։

side-effect requested
   └─▶ compute resume-stable ledger key
         └─▶ barrier: key already committed?
               ├─ yes ─▶ skip (no double-send)
               └─ no  ─▶ perform effect ─▶ commit key

Արդյունքը ճիշտ-մեկ-անգամ արտաքին վարքագիծ է, թեև առաքումը ներքին մակարդակում առնվազն-մեկ-անգամ է։ Վերափորձերն ապահով են ըստ կառուցվածքի, ինչը հենց թույլ է տալիս turn-ի վերականգնմանը (տես Առաքում, outbox և վերականգնում) վերարտադրել ընդհատված turn-ը՝ առանց հաճախորդի՝ նույն նամակը կամ նույն պատասխանը երկու անգամ ստանալու։

[!TIP] Հենց դրա համար է AiHummer-ը կարող առաջարկել երաշխավորված առաքում և ավտոմատ turn-ի վերականգնում՝ առանց կրկնակի հաղորդագրությունների սովորական ռիսկի — իդեմպոտենտությունը այն հիմքն է, որի վրա կառուցված են առաքման երաշխիքները։

Ուր հաջորդիվ