2025 ж. 28 жел.·7 мин

On‑prem қосымшасының ақауға төзімділігі: сессиялар және кэш

On‑prem қосымшасының ақауға төзімділігін арттыруға арналған практикалық әдістер: сессиялар, sticky sessions, күй (state), кэш, функцияларды деградациялау және апат кезіндегі әрекеттер.

On‑prem қосымшасының ақауға төзімділігі: сессиялар және кэш

FAQ

Почему при сбое одного узла меня разлогинивает или пропадает корзина?

Көбінесе жойылатын нәрсе — белгілі бір түйіннің жадысында сақталған деректер: сессия, локальды кэш, есептегіштер және формадағы уақытша қадамдар. Қайта іске қосу немесе балансировщик арқылы басқа түйінге өту кезінде пайдаланушы басқа нодқа түсіп, оның күйі жоғалып кетеді. Сондықтан разлогин, бос корзина және қайталанған операциялар көрінеді.

Стоит ли включать sticky sessions в on-prem кластере?

Sticky sessions — уақытша шешім ретінде жарайды, егер қосымша күйді түйін жадысында сақтайтын болса және тез өзгерту мүмкін болмаса. Бірақ түйін құлағанда пайдаланушылардың бір бөлігі сессиясын жоғалтады, балансировка нашарлайды. Сол себепті миграция жоспарын (ортақ session store немесе токендер) дайындаған дұрыс.

Что именно можно хранить в сессии, чтобы не было сюрпризов при рестарте?

Негізгі ереже: сессияда тек идентификаторлар мен минималды флэгтар болсын. Барлық «ауыр» деректер — себет құрамасы, форма қадамдары, файлдар — дерекқорда немесе сенімді черновик-хранилищеде сақтау керек. Сонда түйін қайта іске қосылғанда прогресс жоғалмайды, жаңа нода пайдаланушыны қалпына келтіре алады.

Что выбрать для сессий: общий стор, токены или базу данных?

Егер сессияда аз деректер болса және оларды тез қайтарып тастау қажет болмаса, қолтаңбаланған (подписанный) токендер ыңғайлы — кез келген түйін оны тексере алады. Күрделі сценарийлер, кері шақыру немесе қадамдарды сақтау керек болса, ортақ session store немесе дерекқор жақсырақ, бірақ ол желіге тәуелділік қосады.

Как настроить кэш, чтобы он не создавал инциденты сам по себе?

Кэш — жылдамдатқыш, шынайылық көзі емес. Критикалық операциялар кэшке тәуелді болмауы тиіс. Деректер табиғатына қарай әртүрлі TTL қойып, джиттер қосыңыз, сонда кілттер бірден жойылып, лавина пайда болмайды.

Как избежать thundering herd, когда один ключ истек и все пошли в БД?

Қарапайым қорғаныс: single flight (бір сұраныс мәнді қайта есептейді, қалғандары күтеді), кілтке қысқа құлып пен таймаут, stale-while-revalidate — ескірген мәнді беру, қайта есептеу жүріп жатқанда. Сондай‑ақ кэштегі промахтар кезінде дерекқорға параллелизмді шектеу керек.

Что делать, если кэш стал медленным или недоступным?

Кэш баяуласа немесе қолжетімсіз болса, әдепкі бойынша дерекқордан оқу режиміне өтіп, ауыр функцияларды өшіру әлдеқайда дұрыс — базаны толық құлатудан гөрі. Алдын ала қатты таймауттар және деградация режимдері енгізілгені маңызды: қарапайым жауаптар, rate limit және жеңілдетілген беттер.

Где нужна строгая консистентность, а где можно позволить устаревшие данные?

Қатты консистенттілік қажет жерлер: төлемдер, лимиттер, құқықтар, тапсырыстарды растау, токендер — бұл деректер бірден дәл болуы керек және қайталаудан қорғалған болуы тиіс. Қалғандарын — каталог, лента, агрегаттар — аздап ескірткен күйде беруге болады, егер қабылданған уақыт терезесін бекіткен болсаңыз.

Как защититься от дублей при ретраях и непонятных статусах операций?

Қатал жазбалар үшін идемпотенттілік енгізіңіз: операцияға UUID сияқты idempotency key қосыңыз, сонда қайталанған сұраныс дубль жасамайды, ал бұрын жасалған нәтижені қайта қайтарады. Дерекқорда commit болғаннан кейін кэшті оқиға бойынша инвалидировать етіңіз, ал TTL қосымша сақтандыру рөлін атқарады.

Какие тесты нужно сделать перед релизом, чтобы убедиться в отказоустойчивости?

Тексерулердің мысалы: пайдаланушы кіріп, форма толтырып жатыр, сіз бір түйінді қайта іске қосасыз — ол басқа түйінге өтіп, черновик сақталған және разлогин жоқ болу тиіс. Кэшті алып тастап немесе оған кеш жауап қоссақ, жүйе басқарылатын түрде деградировать етуі керек және метрикалар (p95/p99, таймауттар, жүктеме) бақылауда болуы тиіс.