Zgjimi i bazave të të dhënave pa lidhje të vdekura
Aplikacionet e publikuara në Mythex, dhe bazat e tyre të të dhënave, bien në gjumë kur askush nuk i përdor. Kur një aplikacion zgjohej, mund ta mbante kërkesën e parë 10–12 sekonda, sepse përpiqej të ripërdorte lidhjet me bazën e të dhënave që kishin vdekur gjatë gjithë gjumit. Tani u japim aplikacioneve Spring Boot cilësime bazash të dhënash të sigurta gjatë gjumit, dhe i themi agjentit të ndërtojë aplikacione të çdo stack-u në të njëjtën mënyrë. Në platformën e hostimit, kërkesa e parë pas zgjimit shkoi nga 12.7 sekonda në 2.3 sekonda.
Pse aplikacionet dhe bazat e të dhënave flenë
Një aplikacion i publikuar në Mythex ekzekutohet në një makinë që pezullohet pas disa minutash joaktivitet, dhe baza e tij e të dhënave është Postgres serverless që fle pas pesë minutash joaktivitet dhe zgjohet në kërkesën e radhës. Kjo është ajo që e mban të lirë një aplikacion i qetë: paguani për atë që baza e të dhënave përdori realisht, dhe një aplikacion në gjumë nuk shpenzon asgjë për llogaritje. Kemi shkruar për anën e faturimit në faturimi i bazave të të dhënave sipas asaj që përdorin realisht.
Kthesa është se të dyja flenë veç e veç, dhe nuk bien dakord për atë që është një lidhje.
Simptoma: një vizitë e ngadaltë e parë
Shumica e aplikacioneve të serverit mbajnë një connection pool: një grusht lidhjesh të hapura me bazën e të dhënave, të gatshme, që çdo kërkesë të mos paguajë koston e hapjes së një lidhjeje të re. Ky është dizajni i duhur për një aplikacion që është gjithmonë aktiv.
Në gjumë, ndodh kjo:
- Aplikacioni është duke funksionuar, me disa lidhje joaktive në pool.
- Askush nuk viziton. Makina e aplikacionit pezullohet — e ngrirë, me pool-in e paprekur.
- Baza e të dhënave fle dhe e lë të bjerë anën e vet të çdo lidhjeje.
- Vjen një vizitor. Aplikacioni zgjohet ashtu siç ishte, duke mbajtur ende lidhje që baza e të dhënave nuk i njeh më.
- Pool-i i jep njërën prej atyre lidhjeve. Duhet të zbulojë se është e vdekur — duke e provuar dhe duke pritur — para se ta braktisë.
Në një aplikacion Spring Boot, validimi i atyre lidhjeve të vdekura bllokonte kërkesën e parë rreth 10 sekonda para se të dështonte me "Connection is not available". Për vizitorin, sajti thjesht dukej i ngrirë, dhe pastaj ndoshta shfaqte një gabim.
Pse aplikacionet Spring e pësuan më keq
Spring Boot është një framework i njohur Java, dhe përdor si parazgjedhje një connection pool të quajtur HikariCP. Spring mund ta konfigurojë atë pool nga cilësimet, përfshirë sa lidhje joaktive të mbajë.
Por Mythex i jep çdo aplikacioni bazën e vet të të dhënave si një DATABASE_URL të vetme në formën postgresql://user:pass@host/db. Spring nuk e lexon drejtpërdrejt atë format. Kështu aplikacionet Spring të ndërtuara në Mythex po krijonin vetë pool-in e tyre në kod, duke e analizuar atë URL — dhe një pool i ndërtuar me dorë injoron të gjitha cilësimet spring.datasource.* të Spring. Edhe nëse dikush dinte cilësimet e duhura të pool-it, nuk kishte ku të hynin në fuqi.
Zgjidhja, pjesa 1: cilësime që Spring mund t’i përdorë
Kur një projekt ka një bazë të dhënash, tani i japim edhe variabla mjedisi që Spring i lexon natyrshëm:
SPRING_DATASOURCE_URL,SPRING_DATASOURCE_USERNAMEdheSPRING_DATASOURCE_PASSWORD, të konvertuara ngaDATABASE_URL(me SSL të kërkuar, përveç nëse URL thotë ndryshe).- Cilësime pool-i që mbijetojnë gjumin:
| Cilësimi | Vlera | Pse |
|---|---|---|
| Lidhjet minimale joaktive | 0 | Mos mbaj asnjë lidhje të hapur mes kërkesave, kështu që nuk ka asgjë që të vjetërohet |
| Koha e joaktivitetit | 30 sekonda | Mbyll shpejt lidhjet e papërdorura |
| Jetëgjatësia maksimale | 2 minuta | Tërhiq çdo lidhje përpara se të plaket |
| Koha e lidhjes | 5 sekonda | Mos e mbaj një kërkesë gjatë nëse baza e të dhënave përgjigjet ngadalë |
Pa lidhje joaktive të mbajtura, një aplikacion që zgjohet hap një lidhje të re në vend që të kalojë nëpër ato të vdekura.
Me këto variabla të pranishme, Spring e konfiguron vetë pool-in, dhe cilësimet zbatohen. Çdo gjë që projekti ka vendosur vetë fiton gjithmonë; ne plotësojmë vetëm atë që mungon. Aplikacionet jo-Spring i injorojnë këto variabla.
Detaji që pothuajse e bëri pa efekt
Spring i lidh variablat e mjedisit me cilësimet e veta sipas një rregulli që është e lehtë të gabohet. Cilësimi minimum-idle duhet shkruar si SPRING_DATASOURCE_HIKARI_MINIMUMIDLE — viza hiqen, fjalët bashkohen. Shkruar si SPRING_DATASOURCE_HIKARI_MINIMUM_IDLE, që duket më natyrale, lidhet me një cilësim tjetër që nuk ekziston (minimum.idle) dhe injorohet heshtazi.
Kjo është lloji i gabimit që kalon çdo rishikim dhe nuk bën asgjë në prodhim. Kështu që një test kontrollon si që vlerat janë vendosur, ashtu edhe që asnjë variabël nuk përdor formën me nënvizim.
Zgjidhja, pjesa 2: çdo stack tjetër
Spring nuk është i vetmi framework me pool, dhe nuk mund të konfigurojmë paraprakisht çdo bibliotekë në çdo gjuhë. Kështu që agjenti i Mythex — AI që shkruan aplikacionin tuaj — tani merr një udhëzim të përhershëm për çdo stack: aplikacionet e publikuara dhe bazat e tyre të të dhënave flenë kur janë joaktive, kështu që një lidhje e mbajtur hapur mund të jetë e vdekur në kërkesën e radhës. Duhet të:
- mos mbajë asnjë lidhje joaktive me bazën e të dhënave hapur, ose të kontrollojë çdo lidhje para përdorimit,
- të provojë përsëri një herë në një gabim lidhjeje, dhe
- të përdorë cilësimet e bazës së të dhënave që platforma i jep në mjedis, në vend që të ndërtojë pool-in e vet duke analizuar
DATABASE_URL.
Pika e fundit e mbyll unazën me pjesën 1: një aplikacion i ndërtuar mbi cilësimet e dhëna merr automatikisht konfigurimin e sigurt për gjumin.
Rezultati
Të matur në platformën e hostimit ku i publikojmë aplikacionet, kërkesa e parë pas një zgjimi shkoi nga 12.7 sekonda në 2.3 sekonda.
Çfarë nxorëm nga kjo
- Çdo shtresë që fle duhet të bjerë dakord për atë që mbijeton. Një aplikacion i ngrirë dhe një bazë e të dhënave në gjumë bënë secila zgjedhje të arsyeshme. Së bashku, aplikacioni u zgjua duke mbajtur gjendje që nuk ishte më e vërtetë.
- Parazgjedhjet e projektuara për serverë gjithmonë aktivë nuk përshtaten me aplikacione që zvogëlohen në zero. Mbajtja e lidhjeve të ngrohta është ide e mirë derisa çdo gjë rreth tyre të ftohet.
- Jepini frameworks-eve të dhënat në formatin e vet. Një URL e thjeshtë për ne i detyronte çdo aplikacion Spring të ndërtonte me dorë një pool që injoronte konfigurimin e vet.
- Testoni që një cilësim është shkruar në mënyrën që e lexon framework-u. Një vlerë e saktë nën emër të gabuar nuk bën asgjë, heshtazi.
Nëse jeni të rinj me mënyrën si funksionojnë bazat e të dhënave në Mythex, shihni dokumentacionin e bazës së të dhënave dhe udhëzuesin tonë për çfarë është Postgres.