డెడ్ కనెక్షన్లు లేకుండా డేటాబేస్లను మేల్కొలపడం
Mythex లో ప్రచురించిన యాప్లు, వాటి డేటాబేస్లు, ఎవరూ వాడనప్పుడు నిద్రపోతాయి. యాప్ మేల్కొన్నప్పుడు, అది మొదటి రిక్వెస్ట్ను 10–12 సెకన్ల పాటు పట్టుకోగలదు, ఎందుకంటే అన్నీ నిద్రపోతున్నప్పుడు చనిపోయిన డేటాబేస్ కనెక్షన్లను మళ్లీ వాడటానికి ప్రయత్నించింది. ఇప్పుడు మేము Spring Boot యాప్లకు నిద్ర-సురక్షిత డేటాబేస్ సెట్టింగ్లు ఇస్తాము, మరియు ఏ స్టాక్ యాప్నైనా అదే విధంగా నిర్మించమని ఏజెంట్కు చెబుతాము. హోస్టింగ్ ప్లాట్ఫామ్పై, మేల్కొన్న తర్వాత మొదటి రిక్వెస్ట్ 12.7 సెకన్ల నుంచి 2.3 సెకన్లకు తగ్గింది.
యాప్లు మరియు డేటాబేస్లు ఎందుకు నిద్రపోతాయి
ప్రచురించిన Mythex యాప్ కొన్ని నిమిషాల నిష్క్రియ తర్వాత నిలిచిపోయే యంత్రంపై రన్ అవుతుంది, మరియు దాని డేటాబేస్ ఐదు నిమిషాల నిష్క్రియ తర్వాత నిద్రపోయే సర్వర్లెస్ Postgres, తదుపరి క్వెరీతో మేల్కొంటుంది. నిశ్శబ్ద యాప్ను చౌకగా ఉంచేది అదే: డేటాబేస్ వాస్తవంగా ఉపయోగించినదానికి మాత్రమే చెల్లిస్తారు, నిద్రపోతున్న యాప్ కంప్యూట్పై ఏమీ ఖర్చు చేయదు. బిల్లింగ్ వైపు గురించి మేము డేటాబేస్లను వాస్తవ వినియోగం ప్రకారం బిల్ చేయడం లో రాశాము.
పట్టుకునేది ఏమిటంటే, రెండూ విడివిడిగా నిద్రపోతాయి, మరియు కనెక్షన్ అంటే ఏమిటో వాటికి ఏకాభిప్రాయం ఉండదు.
లక్షణం: నెమ్మదైన మొదటి విజిట్
చాలా సర్వర్ యాప్లు connection pool ను నిర్వహిస్తాయి: కొన్ని తెరిచి ఉన్న డేటాబేస్ కనెక్షన్లు సిద్ధంగా ఉంచబడతాయి, కాబట్టి ప్రతి రిక్వెస్ట్ కొత్త కనెక్షన్ తెరవడానికి ఖర్చు చేయదు. ఎల్లప్పుడూ ఆన్లో ఉండే యాప్కు అది సరైన డిజైన్.
నిద్రతో ఇలా జరుగుతుంది:
- యాప్ రన్ అవుతోంది, దాని పూల్లో కొన్ని నిష్క్రియ కనెక్షన్లు ఉన్నాయి.
- ఎవరూ విజిట్ చేయరు. యాప్ యంత్రం సస్పెండ్ అవుతుంది — స్తంభించి, దాని పూల్ చెక్కుచెదరకుండా.
- డేటాబేస్ నిద్రపోతుంది, మరియు ప్రతి కనెక్షన్ యొక్క తన చివరను వదిలేస్తుంది.
- ఒక విజిటర్ వస్తాడు. యాప్ ఉన్నది ఉన్నట్టే మేల్కొంటుంది, డేటాబేస్కు తెలియని కనెక్షన్లను ఇంకా పట్టుకుని.
- పూల్ ఆ కనెక్షన్లలో ఒకదాన్ని ఇస్తుంది. అది చనిపోయిందని తెలుసుకోవాలి — ప్రయత్నించి వేచి ఉండటం ద్వారా — దాన్ని వదిలేసే ముందు.
Spring Boot యాప్లో, ఆ డెడ్ కనెక్షన్లను ధృవీకరించడం మొదటి రిక్వెస్ట్ను సుమారు 10 సెకన్ల పాటు ఆపి, “Connection is not available” అని విఫలమయ్యేది. విజిటర్కు సైట్ కేవలం హ్యాంగ్ అయినట్టు కనిపించేది, తర్వాత ఎర్రర్ చూపించేది.
Spring యాప్లు ఎందుకు ఎక్కువగా బాధపడ్డాయి
Spring Boot ఒక ప్రసిద్ధ Java ఫ్రేమ్వర్క్, మరియు ఇది డిఫాల్ట్గా HikariCP అనే connection pool ను ఉపయోగిస్తుంది. 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 | రిక్వెస్ట్ల మధ్య ఏదీ తెరిచి ఉంచవద్దు, కాబట్టి పాతబడేది ఏదీ ఉండదు |
| Idle timeout | 30 సెకన్లు | ఉపయోగించని కనెక్షన్లను త్వరగా మూసివేయండి |
| గరిష్ట జీవితకాలం | 2 నిమిషాలు | ప్రతి కనెక్షన్ పాతబడకముందే రిటైర్ చేయండి |
| Connection timeout | 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 యాప్ను దాని స్వంత కాన్ఫిగరేషన్ను విస్మరించే పూల్ను చేతితో నిర్మించేలా చేసింది.
- సెట్టింగ్ ఫ్రేమ్వర్క్ చదివే స్పెల్లింగ్లోనే ఉందో పరీక్షించండి. తప్పు పేరుతో సరైన విలువ ఏమీ చేయదు, నిశ్శబ్దంగా.
ఇక్కడ డేటాబేస్లు ఎలా పనిచేస్తాయో మీకు కొత్తైతే, డేటాబేస్ డాక్స్ మరియు Postgres అంటే ఏమిటి అనే మా వివరణ చూడండి.