Мазмунга өтүү

Туруктуу сервистерди куруу: таймауттар, кайталоолор жана жумшак токтотуу

Сабактын башталышы

Туруктуу сервистер: таймауттар, кайталоолор жана жумшак токтотуу

Node-сервисти анын көз карандылыктары, тармагы жана оркестратору бир убакта начар иштеп жатканда иштөө абалында кармоо.

Негизги ой: туруктуу сервис өзүнүн маалымат базасы, кэши, төмөнкү API'лери же иштеп жаткан машинасы ишенимдүү деп болжолдобойт. Ал жарым-жартылай баш тартууну кадимки туруктуу абал деп эсептейт жана суроо-талаптарды жоготпой, абалды бузбай деградацияланууга, калыбына келүүгө жана кайра иштетүүгө ылайыкталган. Ага арналган куралдар кичинекей, жакшы изилденген топ түзөт: чектелген таймауттар, тартиптүү кайталоолор кечигүү менен, сактагычтар (circuit breaker), чынчыл жашоо жөндөмдүүлүк жана даярдык текшерүүлөрү жана SIGTERM боюнча жумшак токтотуу.
Аягында сиз муну кыла аласыз:
  • оркестратор SIGTERM жибергенде аткарылып жаткан ишти дренаждап, таза чыгуу;
  • жашоо жөндөмдүүлүк (liveness) текшерүүсүн даярдык (readiness) текшерүүсүнөн айырмалоо жана кайсынысы трафикти башкарарын билүү;
  • AbortController аркылуу ар бир чыгыш көз карандылык чакырыгына катуу таймаут коюу;
  • экспоненциалдык кечигүү жана джиттер менен болгону идемпотенттик ишти кайталоо -- жана КАЧАН кайталабоо керектигин билүү;
  • ишенимсиз көз карандылыкты сактагычка ороп, бир оорулуу бэкенд сизди кулатпашы үчүн.

Бул тема Микросервистер архитектурасына (сервистер кантип бөлүнөт) жана Логдоо жана байкоого (болуп жаткан нерсени кантип көрөсүз) таянат. Бул жерде биз сөзсүз жарым-жартылай баш тартууда аман калууга гана топтолобуз. Сиз промистерди, async/await жана Node окуя циклин мурунтан эле ишенимдүү өздөштүргөн деп болжолдонот.

1. Жумшак токтотуу: SIGTERM -- бул суроо, өлтүрүү эмес

Контейнер платформасында (Kubernetes, ECS, Nomad же жөн эле docker stop) кайра иштетүү -- кадимки нерсе: жаңы деплой, масштабды кичирейтүү, түйүндү иштен чыгаруу же ийгиликсиз ден соолук текшерүүсү -- баары процессиңизди токтотот. Платформа муну эки кадам менен жасайт. Адегенде ал SIGTERM жибергет -- сылык "сураныч, аяктап, чыгыңыз". Андан кийин, жеңилдик мезгилинен кийин (Kubernetes'те демейки боюнча 30 секунд), эгер дагы иштеп жатсаңыз, ал SIGKILL жибергет, аны кармоого, бөгөттөөгө же иштетүүгө болбойт жана сизди дароо токтотот.

Аңкоо сервис SIGTERM'ди тоготпойт. Бул сигнал үчүн Node'дун демейки аракети -- дароо чыгуу, ошондуктан ошол учурда тейленип жаткан ар бир суроо-талап жооптун ортосунда үзүлөт, ачык БД транзакциялары таштап коюлат, ал эми клиент туташуунун үзүлүшүн көрөт. Жумшак токтотуу дегени SIGTERM'ди кармап, тартиби менен:

  1. Жаңы ишти кабыл албай коюу -- server.close() чакыруу, ал жаңы туташууларды угуп калбайт, бирок аткарылып жаткан суроо-талаптарга аяктоого мүмкүндүк берет.
  2. Даярдыкты кулатуу -- "даяр эмес" деп кайтара баштоо, балансировщик бул нускага жаңы трафик багыттабашы үчүн.
  3. Аткарылып жаткан суроо-талаптарды дренаждоо -- учурдагы иштетүүчүлөрдүн аяктоосун таймаут менен чектеп күтүү.
  4. Көз карандылыктарды жабуу -- БД пулдарын аяктоо, логдорду төгүү, билдирүү брокеринен ажыроо.
  5. 0 коду менен чыгуу.

Салыштыруу. SIGTERM -- бул дүкөндөн жабылууну суроо. Кылдат дүкөн алдыңкы эшикти бекитет, жаңы кардарлар кирбеши үчүн, ичинде турган адамдарды тейлейт, кассаны эсептейт, анан жарыкты өчүрөт. Кылдатсыз дүкөн кардарлар төлөмдүн ортосунда турганда жөн эле токту өчүрөт. SIGKILL деген ошол токту өчүрүү -- аны менен эч нерсе кыла албайсыз, дал ошондуктан ал келгенге чейин бүткүңүз келет.

Маанилүү деталь: дренажга катуу дедлайн кошуу керек. Эгер жай суроо-талап эч качан аяктабаса, түбөлүк күтүү SIGKILL акыры баары бир сизди иштин ортосунда өлтүрөрүн билдирет -- эки дүйнөнүн эң жаманы. Дренажга, айталы, 25 секунд бериңиз (платформанын 30с жеңилдик мезгилинен ыңгайлуу кем) жана ашса process.exit(1) чакырыңыз, кайсы суроо-талаптар ачык калганын логдоп.

Kubernetes'те дагы бир кылдаттык: платформанын подуңузду Service эндпоинттеринен алып салуусу менен SIGTERM жиберүүсүнүн ортосунда жарыш бар. Кыска терезеде балансировщик токтото баштаганыңыздан кийин дагы трафик жибериши мүмкүн. Кадимки чечим -- SIGTERM'ди алгандан кийин бир нече секунд уктоо (же адегенде даярдыкты кулатып, күтүү) server.close()'ду чакыруудан мурун, эндпоинтти алып салуу таралышы үчүн.

Бул сабакты YourAIZone платформасында улантыңыз

Толук сабакта — толук түшүндүрмө, чыгарылган мисалдар, көп кездешкен каталар, заматта текшерилүүчү тесттер жана ЖИ-репетитор. Конок катары дароо баштаңыз же прогрессти сактоо үчүн аккаунт түзүңүз.

Толук сабакта

  • Толук түшүндүрмө
  • Чыгарылган мисалдар
  • Көп кездешкен каталар жана алардан кантип качуу керек
  • Тест суроолору: 15
  • Тема боюнча суроолорго жооп берген ЖИ-репетитор
  • Окуучу, ата-эне жана мугалим үчүн прогрессти көзөмөлдөө