Blogg

Vakna gagnagrunnar án dauðra tenginga

Birt forrit á Mythex, og gagnagrunnar þeirra, fara í svefn þegar enginn notar þau. Þegar forrit vaknaði gat það haldið fyrstu beiðninni í 10–12 sekúndur, því það reyndi að endurnýta gagnagrunnstengingar sem höfðu dáið meðan allt svaf. Við gefum nú Spring Boot-forritum gagnagrunnsstillingar sem eru öruggar eftir svefn, og segjum aðstoðarmanninum að smíða forrit í hvaða stafla sem er á sama hátt. Á hýsingarvettvanginum fór fyrsta beiðnin eftir vökn úr 12,7 sekúndum í 2,3 sekúndur.

Af hverju forrit og gagnagrunnar sofa

Birt Mythex-forrit keyrir á vél sem leggst í dvala eftir nokkrar mínútur án notkunar, og gagnagrunnurinn þess er serverless Postgres sem sofnar eftir fimm mínútur án virkni og vaknar við næstu fyrirspurn. Það heldur kyrru forriti ódýru: þú borgar fyrir það sem gagnagrunnurinn raunverulega notaði, og sofandi forrit eyðir engu í reikniafl. Við skrifuðum um reikningshliðina í að rukka gagnagrunna eftir því sem þeir raunverulega nota.

Vandinn er að þau sofna sitt í hvoru lagi og þau eru ekki sammála um hvað tenging er.

Einkennið: hægt fyrsta skipti

Flest serverforrit halda tengingalaug: handfylli af opnum gagnagrunnstengingum sem eru tilbúnar, þannig að hver beiðni greiðir ekki kostnaðinn við að opna nýja. Það er rétt hönnun fyrir forrit sem er alltaf í gangi.

Hér er það sem gerist með svefninum:

  1. Forritið er í gangi með nokkrar aðgerðalausar tengingar í laugunni.
  2. Enginn heimsækir. Vél forritsins leggst í dvala, frosin, með laugina óskerta.
  3. Gagnagrunnurinn fer að sofa og sleppir sínum enda á hverri tengingu.
  4. Gestur kemur. Forritið vaknar nákvæmlega eins og það var, en heldur enn tengingum sem gagnagrunnurinn þekkir ekki lengur.
  5. Laugin réttir út eina af þessum tengingum. Hún þarf að komast að því að hún sé dauð, með því að prófa hana og bíða, áður en hún gefst upp á henni.

Í Spring Boot-forriti stöðvaði það að staðfesta dauðu tengingarnar fyrstu beiðnina í um 10 sekúndur áður en hún mistókst með „Connection is not available“. Fyrir gestinn hékk síðan einfaldlega, og birti síðan kannski villu.

Af hverju Spring-forrit fóru verst

Spring Boot er vinsæll Java-rammi og notar tengingalaug sem heitir HikariCP sjálfgefið. Spring getur stillt þá laug úr stillingum, þar á meðal hversu margar aðgerðalausar tengingar á að halda.

En Mythex gefur hverju forriti gagnagrunninn sinn sem eina DATABASE_URL á forminu postgresql://user:pass@host/db. Spring getur ekki lesið það snið beint. Þess vegna bjuggu Spring-forrit á Mythex til sína eigin laug í kóða með því að þátta þessa slóð, og laug sem er smíðuð í höndunum hunsar allar spring.datasource.*-stillingar Spring. Jafnvel þótt einhver vissi réttu stillingarnar hefði enginn stað þar sem þær tækju gildi.

Lagfæring 1: stillingar sem Spring getur notað

Þegar verkefni er með gagnagrunn fær það nú líka umhverfisbreytur sem Spring les beint:

  • SPRING_DATASOURCE_URL, SPRING_DATASOURCE_USERNAME og SPRING_DATASOURCE_PASSWORD, umbreytt úr DATABASE_URL (með SSL krafist nema slóðin segi annað).
  • Stillingar laugar sem lifa af svefn:
StillingGildiAf hverju
Lágmarksfjöldi aðgerðalausra tenginga0Engin tenging er opin milli beiðna, þannig að ekkert getur úrelst
Tímamörk aðgerðaleysis30 sekúndurLoka ónotuðum tengingum fljótt
Hámarksaldur tengingar2 mínúturTaka hverja tengingu úr notkun áður en hún getur eldst
Tímamörk tengingar5 sekúndurEkki halda beiðni lengi ef gagnagrunnurinn er seinn að svara

Án aðgerðalausra tenginga í haldi opnar vaknað forrit eina nýja tengingu í stað þess að vaða í gegnum dauðar.

Þegar þessar breytur eru til staðar stillir Spring laugina sjálf og stillingarnar taka gildi. Það sem verkefnið hefur stillt sjálft vinnur alltaf; við fyllum aðeins í það sem vantar. Forrit sem eru ekki Spring hunsa þessar breytur.

Smáatriðið sem næstum gerði ekkert

Spring varpar umhverfisbreytum á stillingar sínar eftir reglu sem er auðvelt að fara rangt með. Stillingin minimum-idle þarf að vera skrifuð sem SPRING_DATASOURCE_HIKARI_MINIMUMIDLE, bandstrik fjarlægð og orðin tengd saman. Ef hún er skrifuð sem SPRING_DATASOURCE_HIKARI_MINIMUM_IDLE, sem lítur eðlilegra út, varpast hún á aðra, ekki til staðar (minimum.idle), og er þagandi hunsuð.

Slík mistök standast hverja yfirferð og gera ekkert í framleiðslu. Þess vegna athugar próf bæði að gildin séu sett og að engin breyta noti formið með undirstrikunum.

Lagfæring 2: hvern annan stafla sem er

Spring er ekki eini ramminn með laug, og við getum ekki forstillt hvert bókasafn á hverju tungumáli. Þess vegna fær gervigreindin sem skrifar forritið þitt, Mythex-aðstoðarmaðurinn, nú fastar leiðbeiningar fyrir hvaða stafla sem er: birt forrit og gagnagrunnar þeirra sofna þegar þau eru aðgerðalaus, þannig að tenging sem er opin getur verið dauð við næstu beiðni. Hann ætti að:

  • halda engum aðgerðalausum gagnagrunnstengingum opnum, eða athuga hverja áður en hún er notuð,
  • reyna aftur einu sinni við tengivillu, og
  • nota gagnagrunnsstillingar sem vettvangurinn gefur í umhverfinu, í stað þess að smíða sína eigin laug með því að þátta DATABASE_URL.

Síðasti punkturinn lokar hringnum með fyrsta hlutanum: forrit sem byggt er á útvegaðu stillingunum tekur sjálfkrafa upp svefnþolna uppsetningu.

Niðurstaðan

Mælt á hýsingarvettvanginum sem við keyrum birt forrit á fór fyrsta beiðnin eftir vökn úr 12,7 sekúndum í 2,3 sekúndur.

Það sem við lærðum

  • Hvert lag sem sefur þarf að vera sammála um hvað lifir af. Frosið forrit og sofandi gagnagrunnur tóku hvort um sig skynsamlega ákvörðun. Saman vaknaði forritið með ástand sem var ekki lengur satt.
  • Sjálfgefnar stillingar sem eru hannaðar fyrir þjóna í stöðugri keyrslu passa ekki við forrit sem skala niður í núll. Að halda tengingum heitum er góð hugmynd þangað til allt í kringum þær kólnar.
  • Gefðu römmum gögnin sín á þeirra eigin sniði. Ein slóð var einföld fyrir okkur en neyddi hvert Spring-forrit til að smíða laug í höndunum sem hunsaði eigin stillingar.
  • Prófaðu að stilling sé stafsett eins og rammin les hana. Rétt gildi undir röngu nafni gerir ekkert, þegjandi.

Ef þú ert ný/nýr í því hvernig gagnagrunnar virka á Mythex, sjá gagnagrunnsskjölin og útskýringu okkar á hvað Postgres er.

Mythex · Pricing · Smíðaðu hvað sem er með gervigreind · Sniðmát fyrir vefsíður og forrit · Mythex í samanburði · Orðasafn um forritasmíði með gervigreind · Ókeypis verkfæri fyrir forritasmíði með gervigreind · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia 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 简体中文 繁體中文(香港) 繁體中文(台灣)