ડેડ કનેક્શન વિના ડેટાબેઝને ફરી જગાડવા
Mythex પરની પબ્લિશ થયેલી એપ્સ, અને તેમના ડેટાબેઝ, કોઈ વાપરતું ન હોય ત્યારે સૂઈ જાય છે. જ્યારે એપ જાગતી, ત્યારે તેની પહેલી વિનંતી 10–12 સેકન્ડ સુધી અટકી રહેતી, કારણ કે તે સૂતી વખતે મરી ગયેલાં ડેટાબેઝ કનેક્શન ફરી વાપરવાનો પ્રયાસ કરતી. હવે અમે Spring Boot એપ્સને એવી ડેટાબેઝ સેટિંગ્સ આપીએ છીએ જે સ્લીપ પછી પણ સુરક્ષિત હોય, અને એજન્ટને કહીએ છીએ કે કોઈ પણ સ્ટેક માટે એપ આ જ રીતે બનાવે. હોસ્ટિંગ પ્લેટફોર્મ પર, જાગ્યા પછીની પહેલી વિનંતી 12.7 સેકન્ડથી ઘટીને 2.3 સેકન્ડ થઈ.
એપ્સ અને ડેટાબેઝ કેમ સૂઈ જાય છે
પબ્લિશ થયેલી Mythex એપ થોડી નિષ્ક્રિય મિનિટો પછી સસ્પેન્ડ થતા મશીન પર ચાલે છે, અને તેનો ડેટાબેઝ સર્વરલેસ Postgres છે જે પાંચ નિષ્ક્રિય મિનિટ પછી સૂઈ જાય છે અને આગલી વિનંતી પર જાગે છે. એ જ શાંત એપને સસ્તી રાખે છે: ડેટાબેઝ ખરેખર વાપરેલા માટે તમારી પાસેથી શુલ્ક લેવાય છે, અને સૂતી એપ કમ્પ્યુટ પર કંઈ ખર્ચતી નથી. બિલિંગની બાજુ વિશે અમે ડેટાબેઝનું બિલ તે જેટલો વપરાય છે તે પ્રમાણે માં લખ્યું છે.
પકડ એ છે કે બંને અલગ-અલગ સૂએ છે, અને તેઓ કનેક્શન શું છે તે વિશે સહમત નથી.
લક્ષણ: પહેલી મુલાકાત ધીમી
મોટાભાગની સર્વર એપ કનેક્શન પૂલ જાળવે છે: ડેટાબેઝ કનેક્શનોની થોડી સંખ્યા ખુલ્લી અને તૈયાર રાખેલી હોય, જેથી દરેક વિનંતીએ નવું ખોલવાનો ખર્ચ ન થાય. જે એપ હંમેશાં ચાલુ હોય તેના માટે આ યોગ્ય ડિઝાઇન છે.
સ્લીપ સાથે આવું થાય છે:
- એપ ચાલે છે, તેના પૂલમાં થોડાં નિષ્ક્રિય કનેક્શન છે.
- કોઈ મુલાકાત લેતું નથી. એપનું મશીન સસ્પેન્ડ થાય છે — થીજી જાય છે, પૂલ અકબંધ.
- ડેટાબેઝ સૂઈ જાય છે અને દરેક કનેક્શનનો પોતાનો છેડો છોડી દે છે.
- મુલાકાતી આવે છે. એપ બરાબર તેવી જ રીતે જાગે છે, અને હજી પણ એવાં કનેક્શન પકડી રાખે છે જે ડેટાબેઝ હવે ઓળખતું નથી.
- પૂલ તે કનેક્શનોમાંથી એક આપે છે. તે મરી ગયું છે તે જાણવા માટે — તેને અજમાવીને અને રાહ જોઈને — તેને છોડતા પહેલાં તેણે સમય લેવો પડે છે.
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 શું છે જુઓ.