Blogi

Andmebaaside ärkamine ilma surnud ühendusteta

Mythexi avaldatud rakendused ja nende andmebaasid lähevad magama, kui keegi neid ei kasuta. Kui rakendus ärkas, võis esimese päringu hoida 10–12 sekundit, sest ta püüdis taaskasutada andmebaasiühendusi, mis olid kõige une ajal surnud. Anname nüüd Spring Boot rakendustele andmebaasiseaded, mis on uneseisundi suhtes turvalised, ja ütleme agendile, et ta ehitaks iga tehnoloogiapinu rakendusi samamoodi. Hostimisplatvormil läks esimene päring pärast ärkamist 12,7 sekundist 2,3 sekundini.

Miks rakendused ja andmebaasid magavad

Avaldatud Mythexi rakendus töötab masinal, mis peatub mõne tühikäigu minuti järel, ja selle andmebaas on serverivaba Postgres, mis läheb magama pärast viit tühikäigu minutit ning ärkab järgmise päringu peale. See hoiab vaikse rakenduse odavana: maksad selle eest, mida andmebaas tegelikult kasutas, ja magav rakendus ei kuluta arvutusele midagi. Arveldamisest kirjutasime artiklis andmebaaside arveldamine tegeliku kasutuse järgi.

Koht, kus see kiusab, on see, et need kaks magavad eraldi ja nad ei ole ühel meelel, mis on ühendus.

Sümptom: aeglane esimene külastus

Enamik serverirakendusi hoiab ühenduste basseini: käputäis avatud andmebaasiühendusi, mis on valmis, nii et iga päring ei maksa uue avamise eest. See on õige disain rakendusele, mis on alati sees.

Unerežiimiga juhtub järgmine:

  1. Rakendus töötab, basseinis on mõned tühikäigul olevad ühendused.
  2. Keegi ei külasta. Rakenduse masin peatub — külmutatud, basseini terveks jäetud.
  3. Andmebaas läheb magama ja lõpetab iga ühenduse oma otsast.
  4. Külastaja saabub. Rakendus ärkab täpselt sellisena, nagu oli, ja hoiab ikka ühendusi, millest andmebaas enam ei tea.
  5. Bassein annab välja ühe neist ühendustest. Ta peab enne loobumist välja selgitama, et see on surnud — seda proovides ja ootades.

Spring Boot rakenduses blokeeris nende surnud ühenduste kontrollimine esimese päringu umbes 10 sekundiks, enne kui see ebaõnnestus teatega „Connection is not available“. Külastajale tundus sait lihtsalt kinni jäänud ja siis võis näidata viga.

Miks Spring rakendused said kõige rohkem

Spring Boot on populaarne Java raamistik, ja see kasutab vaikimisi ühenduste basseini nimega HikariCP. Spring saab seda basseini seadistada seadistustest, sealhulgas sellest, mitu tühikäigu ühendust hoida.

Mythex annab aga iga rakendusele andmebaasi ühe DATABASE_URL-muutujana kujul postgresql://user:pass@host/db. Spring ei oska seda formaati otse lugeda. Seetõttu ehitasid Mythexil põhinevad Spring rakendused oma basseini koodis, parsides seda URL-i — ja käsitsi ehitatud bassein ignoreerib kõiki Springi spring.datasource.* seadistusi. Isegi kui keegi teadis õigeid basseini seadeid, polnud kohta, kus need mõjuksid.

Parandus, osa 1: seaded, mida Spring saab kasutada

Kui projektil on andmebaas, annab see nüüd ka keskkonnamuutujad, mida Spring loeb otse:

  • SPRING_DATASOURCE_URL, SPRING_DATASOURCE_USERNAME ja SPRING_DATASOURCE_PASSWORD, teisendatud DATABASE_URL-ist (SSL nõutud, kui URL ei ütle teisiti).
  • Basseini seaded, mis üle elavad une:
SeadeVäärtusMiks
Minimaalne tühikäigu ühenduste arv0Ära hoia midagi päringute vahel avatuna, nii et pole midagi, mis aegub
Tühikäigu aegumine30 sekunditSulge kasutamata ühendused peagi
Maksimaalne eluiga2 minutitLõpeta iga ühendus enne, kui see võib vananeda
Ühenduse aegumine5 sekunditÄra hoia päringut kaua kinni, kui andmebaas vastab aeglaselt

Kuna tühikäigu ühendusi ei hoita, avab ärganud rakendus ühe värske ühenduse, selle asemel et kahlata läbi surnute.

Kui need muutujad on olemas, seadistab Spring basseini ise ja seaded jõustuvad. Projekti enda seatud väärtused võidavad alati; me täidame ainult puuduva. Mitte-Spring rakendused ignoreerivad neid muutujaid.

Detail, mis peaaegu muutis selle mitte-millekski

Spring seob keskkonnamuutujad oma seadistustega reegli järgi, mida on lihtne valesti mõista. Seade minimum-idle tuleb kirjutada kujul SPRING_DATASOURCE_HIKARI_MINIMUMIDLE — kriipsud on ära jäetud, sõnad kokku. Kirjutus SPRING_DATASOURCE_HIKARI_MINIMUM_IDLE, mis näeb loomulikum välja, seostub teise, olematu seadega (minimum.idle) ja jäetakse vaikselt tähelepanuta.

See on sorti viga, mis läbib iga ülevaate ja ei tee tootmises midagi. Seetõttu kontrollib test nii seda, et väärtused on seatud, kui ka seda, et ükski muutuja ei kasuta allkriipsuga eraldatud kuju.

Parandus, osa 2: iga teine pinu

Spring pole ainus raamistik, millel on bassein, ja me ei saa iga teeki igas keeles ette seadistada. Nii saab Mythexi agent — tehisintellekt, mis kirjutab sinu rakendust — nüüd igale pinule püsijuhise: avaldatud rakendused ja nende andmebaasid magavad tühikäigul, seega võib ühendus, mis oli avatud, olla järgmisel päringul surnud. Ta peaks:

  • ei hoidma tühikäigu andmebaasiühendusi avatuna või kontrollima iga ühendust enne kasutamist,
  • proovima ühenduse vea korral uuesti üks kord, ja
  • kasutama platvormi keskkonnas antud andmebaasiseadeid, mitte ehitama oma basseini DATABASE_URL-i parsides.

Viimane punkt sulgeb ringi osaga 1: rakendus, mis on ehitatud pakutud seadete peale, võtab uneturvalise konfiguratsiooni automaatselt.

Tulemus

Mõõdetuna hostimisplatvormil, kus jooksutame avaldatud rakendusi, läks esimene päring pärast ärkamist 12,7 sekundilt 2,3 sekundile.

Mida sellest õppisime

  • Iga kiht, mis magab, peab kokku leppima, mis üle elab. Külmunud rakendus ja magav andmebaas tegid kumbki mõistliku valiku. Koos ärkas rakendus üles olekuga, mis ei olnud enam tõene.
  • Alati sees olevate serverite jaoks mõeldud vaikeseaded ei sobi rakendustele, mis skaleeruvad nullini. Ühenduste soojana hoidmine on hea mõte, kuni kõik nende ümber on külmunud.
  • Anna raamistikele nende andmed nende oma vormingus. Meile oli üks URL lihtne, aga see sundis iga Spring rakendust käsitsi ehitama basseini, mis ignoreeris oma konfiguratsiooni.
  • Testi, et seade on kirjutatud nii, nagu raamistik seda loeb. Õige väärtus vale nime all ei tee midagi, vaikselt.

Kui oled Mythexi andmebaaside toimimisega uus, vaata andmebaaside dokumentatsiooni ja meie selgitust mis on Postgres.

Mythex · Pricing · Ehita kõike AI-ga · Veebilehtede ja rakenduste mallid · Mythex võrdluses · Tehisintellektiga rakenduste ehitamise sõnastik · Tasuta tööriistad tehisintellektiga rakenduste ehitamiseks · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)