Туруктуу сервистер: таймауттар, кайталоолор жана жумшак токтотуу
Node-сервисти анын көз карандылыктары, тармагы жана оркестратору бир убакта начар иштеп жатканда иштөө абалында кармоо.
- оркестратор
SIGTERMжибергенде аткарылып жаткан ишти дренаждап, таза чыгуу; - жашоо жөндөмдүүлүк (liveness) текшерүүсүн даярдык (readiness) текшерүүсүнөн айырмалоо жана кайсынысы трафикти башкарарын билүү;
AbortControllerаркылуу ар бир чыгыш көз карандылык чакырыгына катуу таймаут коюу;- экспоненциалдык кечигүү жана джиттер менен болгону идемпотенттик ишти кайталоо -- жана КАЧАН кайталабоо керектигин билүү;
- ишенимсиз көз карандылыкты сактагычка ороп, бир оорулуу бэкенд сизди кулатпашы үчүн.
Бул тема Микросервистер архитектурасына (сервистер кантип бөлүнөт) жана Логдоо жана байкоого (болуп жаткан нерсени кантип көрөсүз) таянат. Бул жерде биз сөзсүз жарым-жартылай баш тартууда аман калууга гана топтолобуз. Сиз промистерди, async/await жана Node окуя циклин мурунтан эле ишенимдүү өздөштүргөн деп болжолдонот.
1. Жумшак токтотуу: SIGTERM -- бул суроо, өлтүрүү эмес
Контейнер платформасында (Kubernetes, ECS, Nomad же жөн эле docker stop) кайра иштетүү -- кадимки нерсе: жаңы деплой, масштабды кичирейтүү, түйүндү иштен чыгаруу же ийгиликсиз ден соолук текшерүүсү -- баары процессиңизди токтотот. Платформа муну эки кадам менен жасайт. Адегенде ал SIGTERM жибергет -- сылык "сураныч, аяктап, чыгыңыз". Андан кийин, жеңилдик мезгилинен кийин (Kubernetes'те демейки боюнча 30 секунд), эгер дагы иштеп жатсаңыз, ал SIGKILL жибергет, аны кармоого, бөгөттөөгө же иштетүүгө болбойт жана сизди дароо токтотот.
Аңкоо сервис SIGTERM'ди тоготпойт. Бул сигнал үчүн Node'дун демейки аракети -- дароо чыгуу, ошондуктан ошол учурда тейленип жаткан ар бир суроо-талап жооптун ортосунда үзүлөт, ачык БД транзакциялары таштап коюлат, ал эми клиент туташуунун үзүлүшүн көрөт. Жумшак токтотуу дегени SIGTERM'ди кармап, тартиби менен:
- Жаңы ишти кабыл албай коюу --
server.close()чакыруу, ал жаңы туташууларды угуп калбайт, бирок аткарылып жаткан суроо-талаптарга аяктоого мүмкүндүк берет. - Даярдыкты кулатуу -- "даяр эмес" деп кайтара баштоо, балансировщик бул нускага жаңы трафик багыттабашы үчүн.
- Аткарылып жаткан суроо-талаптарды дренаждоо -- учурдагы иштетүүчүлөрдүн аяктоосун таймаут менен чектеп күтүү.
- Көз карандылыктарды жабуу -- БД пулдарын аяктоо, логдорду төгүү, билдирүү брокеринен ажыроо.
- 0 коду менен чыгуу.
Салыштыруу. SIGTERM -- бул дүкөндөн жабылууну суроо. Кылдат дүкөн алдыңкы эшикти бекитет, жаңы кардарлар кирбеши үчүн, ичинде турган адамдарды тейлейт, кассаны эсептейт, анан жарыкты өчүрөт. Кылдатсыз дүкөн кардарлар төлөмдүн ортосунда турганда жөн эле токту өчүрөт. SIGKILL деген ошол токту өчүрүү -- аны менен эч нерсе кыла албайсыз, дал ошондуктан ал келгенге чейин бүткүңүз келет.
SIGKILL акыры баары бир сизди иштин ортосунда өлтүрөрүн билдирет -- эки дүйнөнүн эң жаманы. Дренажга, айталы, 25 секунд бериңиз (платформанын 30с жеңилдик мезгилинен ыңгайлуу кем) жана ашса process.exit(1) чакырыңыз, кайсы суроо-талаптар ачык калганын логдоп.
Kubernetes'те дагы бир кылдаттык: платформанын подуңузду Service эндпоинттеринен алып салуусу менен SIGTERM жиберүүсүнүн ортосунда жарыш бар. Кыска терезеде балансировщик токтото баштаганыңыздан кийин дагы трафик жибериши мүмкүн. Кадимки чечим -- SIGTERM'ди алгандан кийин бир нече секунд уктоо (же адегенде даярдыкты кулатып, күтүү) server.close()'ду чакыруудан мурун, эндпоинтти алып салуу таралышы үчүн.