Көп арендаторлук жана идемпотенттик
AiHummer — көп арендаторлуу: бир шлюз бир маалымат базасынан көп жумушчу мейкиндикти тейлеп, алардын маалыматтарын бөлүп тура алат. Муну эки механизм коопсуз кылат — окуу/жазуу обочолоосу үчүн Postgres Row-Level Security (RLS) жана кайталоолор менен кезекти калыбына келтирүү эч качан реалдуу капталдык эффектти кайталабашы үчүн идемпотенттик катмар.
Row-Level Security менен арендаторду обочолоо
Обочолоо жалаң колдонмо кодунда эмес, маалымат базасында ишке ашырылат. AiHummer суроо-талаптарды
RLS саясаттары колдонулган чектелген Postgres ролу (aihummer_app) аркылуу иштетет,
ошондуктан маалымат базасынын өзү активдүү арендаторго тиешелүү эмес саптарды четке кагат.
RLS — опт-ин. Сиз аны шлюзга чектелген рол үчүн экинчи байланыш сабын берүү менен активдештиресиз:
# 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] Хост-нативдик орнотуулар үчүн орноткуч
AIHUMMER_DB_APP_URLди автоматтык түрдө коёт, ошондуктан стандарттык жайылтууда RLS демейки боюнча күйүк. Эгер өзгөрмө жок болсо, шлюз жалаң ээ пулунда иштейт жана RLS активдүү эмес.
Ар бир арендатор боюнча масштабдоо
Чектелген ролдун ичинде ар бир суроо-талап өз арендаторуна масштабдалат: шлюз байланышта
учурдагы арендатор контекстин коёт, ошондуктан RLS саясаттары туура жумушчу мейкиндикке карата
чечилет. WHERE tenant_id = … чыпкалары бардык жерде кол менен жазылбайт; саясат аны борбордон
ишке ашырат, бул өткөрүлүп жиберилген чыпка башка арендатордун саптарын ачыкка чыгара албашын
билдирет.
Тутум / айланып өтүү режими
Кээ бир жумуш мыйзамдуу түрдө арендаторлор аралык — бүтүндөй инстанс боюнча иштеген фондук жумушчулар, планировщиктер жана тейлөө жумуштары. Алар керектүүсүн көрө алышы үчүн тутум / айланып өтүү режиминде иштейт. Айланып өтүү ишенимдүү ички жумушчулар үчүн гана сакталган, суроо-талапты иштетүүчү жолдор үчүн эмес.
[!WARNING] Миграциялар дайыма ээ пулунда иштейт, эч качан чектелген рол астында эмес. Ээ байланышы схеманы өзгөртүү жана RLS саясаттарын колдонуу укуктарына ээ; чектелген рол атайылап ээ эмес. Эки байланыш сабын ар башка кармаңыз жана
aihummer_appролуна керектүүсүн гана бериңиз.
Идемпотенттик капталдык эффекттер
Кезек реалдуу капталдык эффекттерди өндүрө алат: почта жөнөтүү, каналга билдирүүнү кайра жайгаштыруу. Эгер кезек кайталанса — өтмө катанын себебинен же шлюз кезектин ортосунда кайра иштеп, калыбына келтирүү аны кайра ойнотконунан улам — ал капталдык эффекттер эки жолу болбошу керек. AiHummer муну эки кызматташкан бөлүк менен кепилдейт.
Калыбына-туруктуу журнал ачкычы
Ар бир капталдык эффект калыбына-туруктуу журнал ачкычына каршы жазылат: кезектен детерминисттик түрдө алынган ачкыч, ошондуктан бир эле кезектин кайра ойнотулушу жаңы эмес, ошол эле ачкычты эсептейт. Журнал кайсы ачкычтар буга чейин аткарылганын эстейт.
Капталдык эффект тоскоолу
Почта же канал-жөнөтүү сыяктуу эффект аткарылар алдында ал журналды текшерген капталдык эффект тоскоолунан өтөт. Эгер бул ачкыч буга чейин иштесе, тоскоол кыска тутумга түшөт жана эффект өткөрүлүп жиберилет; болбосо, эффект иштейт жана ачкыч бекемделет.
side-effect requested
└─▶ compute resume-stable ledger key
└─▶ barrier: key already committed?
├─ yes ─▶ skip (no double-send)
└─ no ─▶ perform effect ─▶ commit key
Натыйжасы — жеткирүү ичинде кеминде-бир-жолу болсо да, так-бир-жолу тышкы жүрүм-турум. Кайталоолор курулушу боюнча коопсуз, дал ушул кезекти калыбына келтирүүгө (Жеткирүү, аутбокс жана калыбына келтирүү караңыз) үзгүлтүккө учураган кезекти кардар бир эле email же бир эле жоопту эки жолу албастан кайра ойнотууга мүмкүндүк берет.
[!TIP] Дал ушул себептен AiHummer кайталанган билдирүүлөрдүн адаттагы тобокелдигисиз кепилденген жеткирүүнү жана автоматтык кезекти калыбына келтирүүнү сунуш кыла алат — идемпотенттик — жеткирүү кепилдиктери курулган негиз.
Андан ары кайда
- Кезекти иштеткен рантайм: Шлюз жана кезек кыймылдаткычы.
- Жооптор так бир жолу кантип кайтарыларын: Жеткирүү, аутбокс жана калыбына келтирүү.