Өлі қосылымдарсыз дерекқорларды оятудың жолы
Mythex-те жарияланған қолданбалар мен олардың дерекқорлары ешкім пайдаланбаған кезде ұйқыға кетеді. Қолданба оянғанда, ол ұйқыда өлген дерекқор қосылымдарын қайта пайдаланамын деп әрекет еткендіктен, бірінші сұрауды 10–12 секунд ұстап тұра алатын. Енді Spring Boot қолданбаларына ұйқыдан кейін қауіпсіз дерекқор параметрлерін береміз, ал агентке кез келген стекте қолданбаларды осылай жасауды айтамыз. Хостинг платформасында оянғаннан кейінгі бірінші сұрау 12,7 секундтан 2,3 секундқа дейін қысқарды.
Қолданбалар мен дерекқорлар неге ұйқыға кетеді
Жарияланған Mythex қолданбасы бірнеше бос минуттан кейін тоқтайтын машинада жұмыс істейді, ал оның дерекқоры 5 бос минуттан кейін ұйқыға кетіп, келесі сұрауда оянатын serverless Postgres. Тыныш қолданба арзан болуы осыдан: дерекқор нақты пайдаланған уақыт үшін ақы аласыз (hosting-limits), ал ұйқыдағы қолданба есептеуге ешнәрсе жұмсамайды. Біз төлем жағы туралы дерекқорларға төлемді нақты пайдалануына қарай есептеу жазбасында жаздық.
Ұстаманың мәні мынада: екеуі бөлек ұйықтайды және қосылым деген не екені туралы келіспейді.
Белгісі: алғашқы кіру баяу
Көпшілік сервер қолданбалары қосылым пулын ұстайды: бірнеше ашық дерекқор қосылымы дайын тұрады, сондықтан әр сұрау жаңа қосылым ашуға уақыт жұмсамайды. Бұл үнемі қосулы қолданба үшін дұрыс дизайн.
Ұйқы кезінде мынадай нәрсе болады:
- Қолданба іске қосылған, пулында бірнеше бос қосылым бар.
- Ешкім кірмейді. Қолданбаның машинасы ұйқыға кетеді — пулы сақталған күйде қатып қалады.
- Дерекқор ұйқыға кетеді және әр қосылымның өз жағынан бәрін түсіреді.
- Келуші келеді. Қолданба дәл сол күйінде оянады, әлі де дерекқор білмейтін қосылымдарды ұстап тұр.
- Пул сол қосылымдардың бірін береді. Оны бас тартқанға дейін ол өлі екенін — оны сынап, күтіп — білуі керек.
Spring Boot қолданбасында сол өлі қосылымдарды тексеру бірінші сұрауды шамамен 10 секундқа бөгеді, содан кейін ол «Connection is not available» деген қатемен аяқталады. Келушіге сайт жай ілініп қалғандай, немесе қате көрсеткендей болды.
Spring қолданбалары неге ең көп зардап шегеді
Spring Boot — танымал Java фреймворкі, ол әдепкі бойынша HikariCP деп аталатын қосылым пулын қолданады. Spring пулды параметрлерден, соның ішінде бос күйде қанша қосылым ұстау керектігінен, баптай алады.
Бірақ Mythex әр қолданбаға дерекқорын postgresql://user:pass@host/db түрінде бір DATABASE_URL ретінде береді. Spring мұны тікелей оқи алмайды. Сондықтан Mythex-те құрастырылған Spring қолданбалары пулды өз кодында, URL-ді талдап, қолмен құрастырып алды — ал қолмен құрастырылған пул Spring-тің spring.datasource.* параметрлерін елемейді. Кім дұрыс пул параметрлерін білсе де, олар күшіне енетін жер жоқ еді.
Түзету, 1-бөлік: Spring оқи алатын параметрлер
Жобада дерекқор болғанда, енді оған Spring туған орта айнымалыларын да береміз:
SPRING_DATASOURCE_URL,SPRING_DATASOURCE_USERNAMEжәнеSPRING_DATASOURCE_PASSWORD,DATABASE_URL-дан түрлендірілген (URL басқаша айтпаса, SSL міндетті).- Ұйқыдан аман қалатын пул параметрлері:
| Параметр | Мән | Неліктен |
|---|---|---|
| Бос күйдегі ең аз қосылым саны | 0 | Сұраулар арасында ештеңе ашық қалмайды, сондықтан ескіретін ештеңе жоқ |
| Бос тұру уақыт шегі | 30 секунд | Пайдаланылмаған қосылымдарды тез жабу |
| Ең ұзақ өмір сүру мерзімі | 2 минут | Әр қосылымды ескіріп кетпестен бұрын тоқтату |
| Қосылу күту уақыты | 5 секунд | Дерекқор баяу жауап берсе, сұрауды ұзақ ұстамау |
Ешбір қосылым бос күйде ұсталмағандықтан, оянған қолданба өлі қосылымдарды тексермей-ақ жаңа қосылым ашады.
Бұл айнымалылар болғанда, Spring пулды өзі баптайды, және параметрлер күшіне енеді. Жоба өзі орнатқан мәндер әрқашан жеңеді; біз тек жетіспейтінін толтырамыз. Spring емес қолданбалар бұл айнымалыларды елемейді.
Бір-ақ болмай қалған нәзік мән
Spring орта айнымалыларын параметрлерге шатастыру ережесі оңай қате жасалатын. minimum-idle параметрі SPRING_DATASOURCE_HIKARI_MINIMUMIDLE түрінде жазылуы керек — сызықшалар түсіріліп, сөздер жалғанады. SPRING_DATASOURCE_HIKARI_MINIMUM_IDLE деп жазсаңыз, ол табиғиырақ көрінсе де, басқа, жоқ параметрге (minimum.idle) сәйкес келеді және үнсіз елеусіз қалады.
Мұндай қате әр тексеруден өтеді және өндірісте ешнәрсе істемейді. Сондықтан тест мәндердің орнатылғанын да, ешбір айнымалыда асты сызылған нұсқа жоқтығын да тексереді.
Түзету, 2-бөлік: басқа барлық стектер
Spring — пулы бар жалғыз фреймворк емес, әр тілдегі әр кітапхананы алдын ала баптай алмаймыз. Сондықтан Mythex агенті — қолданбаңызды жазатын AI — енді кез келген стекке тұрақты нұсқау алады: жарияланған қолданбалар мен олардың дерекқорлары бос тұрғанда ұйықтайды, сондықтан ашық ұсталған қосылым келесі сұрауда өлі болуы мүмкін. Ол:
- бос дерекқор қосылымдарын ашық ұстамауы керек, немесе пайдаланар алдында әр қосылымды тексеруі керек,
- қосылым қатесінде бір рет қайта көруі керек, және
DATABASE_URL-ды талдап, өз пулын құрастырудың орнына, платформа ортада берген дерекқор параметрлерін пайдалануы керек.
Соңғы нүкте 1-бөлікпен тұйықталады: платформа берген параметрлерге құрылған қолданба ұйқыға төзімді баптауды автоматты түрде алады.
Нәтиже
Жарияланған қолданбаларды іске қосатын хостинг платформасында өлшегенде, оянғаннан кейінгі бірінші сұрау 12,7 секундтан 2,3 секундқа дейін қысқарды.
Одан не алдық
- Ұйықтайтын әр қабат не сақталатынына келісуі керек. Қатып қалған қолданба мен ұйықтайтын дерекқор әрқайсысы ақылға қонымды таңдау жасады. Бірге алғанда қолданба ақиқат болмай қалған күйді ұстап оянды.
- Үнемі қосулы серверлерге арналған әдепкі параметрлер нөлге дейін масштабтайтын қолданбаларға сай келмейді. Қосылымдарды жылы ұстау жақсы идея, тек айналасындағы бәрі суып қалмағанша.
- Фреймворкке деректерін өз форматында беріңіз. Бір URL бізге оңай болды, бірақ әр Spring қолданбасын өз конфигурациясын елемейтін пулды қолмен жасауға мәжбүр етті.
- Параметр дұрыс мәнмен, бірақ басқа атпен жазылса, ештеңе істемейтінін тексеріңіз. Дұрыс мән дұрыс емес атпен үнсіз ештеңе істемейді.
Егер Mythex-те дерекқорлар қалай жұмыс істейтінін білгіңіз келсе, дерекқор құжаттарын және Postgres деген не түсіндірмесін қараңыз.