Publishን ሁለት ጊዜ ብትጫን አሁን አንድ ጊዜ ብቻ ይታተማል
ለአንድ መተግበሪያ ሦስት የማተም ጥያቄዎች በ84 ሚሊሰከንድ ልዩነት ወደ ኤፒአያችን ደረሱ፣ እያንዳንዳቸውም የዚያን መተግበሪያ ሙሉ ማሰማራት ጀመሩ። እርስ በርሳቸው ወደ አንድ ማስተናገጃ ተሯሯጡ፣ የተገኙት ልቀቶች ብዙዎቹ ሌላ ቀድሞ በመድረሱ ምክንያት ወድቀዋል፣ እና የሚታየው ብቸኛ ምልክት «ልቀቱ አልተሳካም» የሚል ኢሜይል ነበር — መተግበሪያው ራሱ ግን በመጨረሻ ጥሩ ነበር። አሁን ለአንድ መተግበሪያ በመካሄድ ላይ ያለ ማተም ካለ የሚመጣ ማተም ሁለተኛ ግንባታ አይጀምርም። ዳታቤዙ የትኛው ጥያቄ እንደሚያሸንፍ ይወስናል፣ ሌሎቹም እውነቱን ይነገራቸዋል፦ ማተም ቀድሞውኑ እየሄደ ነው።
ምን ተፈጠረ
በMythex ላይ መተግበሪያ ስታትም፣ ኤፒአያችን ለመተግበሪያው ልቀት መዝግቦ ግንባታዎችን የሚያሄደውን አገልግሎት — ኦርኬስትሬተሩን — ይገነባና ይለቅ ዘንድ ይጠይቃል። ማተም ከPublish አዝራሩ፣ ከሌላ የአሳሽ ትር፣ ወይም ወኪሉ ስትጠይቀው ሊጀምር ይችላል። ድርብ ጠቅታ፣ ሁለት ትሮች፣ ወይም ሁለት ጊዜ የመጣ የወኪል ጥያቄ — ሁሉም ለአንድ መተግበሪያ በጣም በቅርብ ጊዜ ከአንድ በላይ ማተም ሊፈጥር ይችላል።
በዚህ ጉዳይ ሦስቱ በ84 ሚሊሰከንድ ውስጥ ደረሱ። እያንዳንዳቸው ሙሉ ማሰማራት አሄዱ። በማስተናገጃው መድረክ፣ ለአንድ መተግበሪያ ልቀቶች በአንድ ሰከንድ ውስጥ ተፈጠሩ፣ እና ሦስቱ ሌሎቹ ቀድመው ስለጀመሩ ተበላሹ። አንድ በኋላ የመጣ ልቀት ተጣብቆ ቆየ፣ እና ከዚያ መተግበሪያው ሰርቷል።
ይህ ለማስተዋል ቀላል እንዲሆን ያደረገው ነው። ተጠቃሚው አንድ የሚሰራ መተግበሪያ ብቻ ነው ያየው። ውድቀቶቹ የታዩት በልቀት-ውድቀት ኢሜይሎች ብቻ ነበር።
ለምን ምንም አላቆመውም
የማተም ኮዱ ለፕሮጀክቱ በመካሄድ ላይ ያሉ ማሰማራቶችን የሚመለከት ደረጃ ነበረው። ነገር ግን የሚያደርገው ከመጀመሩ በፊት በመካሄድ ላይ ያለ እያንዳንዱን ማሰማራት እንደ ወድቋል ምልክት ማድረግ ነበር — «በአዲስ ማተም ተተካ»። የታሰበው ከተበላሸ ሂደት የቀረ ግንባታን ማጽዳት ነበር።
በተግባር፣ በግንባታው መሃል የመጣ ሁለተኛ ማተም የመጀመሪያውን የሞተ አድርጎ አውጆ የራሱን ይጀምር ነበር። ሁለቱም እስከ መጨረሻ ይሮጡ ነበር፣ በአንድ መተግበሪያ ላይ። መቆለፊያ አልነበረም፤ መንገዱን በንቃት የሚያጸዳ ደረጃ ነበር።
ለአንድ መተግበሪያ የመጀመሪያ ማተም ሌላ ይበልጥ እንግዳ ምልክት ነበረው። ገና የማሰማራት መዝገብ ስለሌለ፣ በአንድ ጊዜ ያሉ ሁለት የመጀመሪያ ማተሞች ሁለቱም አንድ መዝገብ ለማስገባት ሞከሩ። ዳታቤዙ በመተግበሪያው የሊንክ ስም (ስሉ፣ ለምሳሌ your-app በyour-app.mythex.ai) ላይ ልዩ ኢንዴክስ አለው፣ ስለዚህ ሁለተኛው ማስገባት ወደቀ። ኤፒአያችን ይህን «ያ የሊንክ ስም ተይዟል» ብሎ ተረጎመው — በዚያ ቅጽበት በዚያ ስም በተሳካ ሁኔታ እየታተመ ያለ መተግበሪያን እንደገና መሰየም እንዳለበት ምክር እየሰጠ።
መፍትሄው፦ ቁልፉ ራሱ መቆለፊያ ነው
የማሰማራቱን መዝገብ መጠየቅ አሁን አንድ ነጠላ ሁኔታዊ የዳታቤዝ ማሻሻያ ነው፦ ይህንን ረድፍ ውሰድ እና ማንም የማያተምበት ከሆነ ብቻ እንደ «በመገንባት» ምልክት አድርገው። አንድ መግለጫ ስለሆነ፣ ዳታቤዙ በተመሳሳይ ሚሊሰከንድ የሚመጡ ጥያቄዎችን ይፈታል። በትክክል አንዱ ብቻ ረድፉን ይቀይራል። ሌሎቹ ምንም ረድፍ እንዳልተቀየረ ያዩና ይቆማሉ፣ ኦርኬስትሬተሩንም አያገኙም።
መቆለፊያ ባለቤቱ ሲሞት መውጫ ያስፈልገዋል። ኤፒአዩ በማተም መሃል ቢነሳ፣ ረድፉ «በመገንባት» ላይ ለዘላለም ይቆይና መተግበሪያው ሊታተም አይችልም። ስለዚህ ባለቤቱ የልብ ምት መላክ ያቆመ ረድፍ — የሚሄደው ማተም ረድፉን በየ30 ሰከንድ ያዘምናል፣ እና አምስት ደቂቃ ዝምታ እንደ ሞተ ይቆጠራል — እንደገና ሊወሰድ ይችላል። ይህ ገደብ ከልብ ምቱ ይመጣል፣ የግንባታ ጊዜ ስለሆነው ግምት አይደለም። የራሱን Dockerfile የሚገነባ የተጠቃሚ ግንባታ በሕጋዊ መንገድ ረዥም ሊሆን ይችላል፣ እናም የልብ ምት እየላከ ያለ ቀርፋፋ ግንባታ ቦታውን ይዞ ይቆያል።
በመካሄድ ላይ ያሉ ማሰማራቶችን ሁሉ ወደ ወድቋል የሚያሳየው ደረጃ ከማተም በፊት አይሠራም። ከሞተ ሂደት የቀሩ ረድፎች ብቻ ይጸዳሉ።
ለተሸነፈው እውነቱን መንገር
የተሸነፈው ጥያቄ አሁን ግልጽ መልስ ያገኛል፦ publish_in_progress፣ ከሚሠራው ማሰማራት ID ጋር። ማተም መጀመር የሚችል እያንዳንዱ ቦታ ይህንን ይይዛል፦
- የስራ ቦታው በመካሄድ ላይ ያለውን ግንባታ ይከተላል፣ በእሱ ላይ ስህተት ከማሳየት ይልቅ።
- ወኪሉ የዚህ መተግበሪያ ማተም እየሄደ መሆኑ እና እንዲጠብቅ ይነገረዋል፣ «አንድ ነገር አልተሳካም» ከመባል ይልቅ — ቀደም ሲል ይህ የDockerfile «ለማስተካከል» ሄዶ ደግሞ ለመሞከር ሊመራው ይችል ነበር።
- የመጀመሪያ-ማተም ግጭት በሊንክ ስሙ ላይ ይፈተሻል፦ ስሙን የያዘው ረድፍ የዚህ ፕሮጀክት የራሱ በመካሄድ ላይ ያለ ማተም ከሆነ፣ መልሱ «አስቀድሞ እየታተመ ነው» ነው፣ «ያ ስም ተይዟል» አይደለም። ከሌላ ፕሮጀክት ጋር እውነተኛ ግጭት ሲሆን የስም-መቀየሪያ መልዕክቱ አሁንም ይሰጣል።
እንዴት እንደፈተንነው
ሶስት የማተም ጥያቄዎችን ለአንድ መተግበሪያ በአንድ ጊዜ በእውነተኛ ዳታቤዝና በstub ኦርኬስትሬተር ላይ የሚያሄድ የማባዣ ስክሪፕት ጽፈናል፣ እና ኦርኬስትሬተሩ ስንት ማሰማራቶች እንደተጠየቀ ቆጥረናል። የመጀመሪያ ማተምንና የቀጥታ መተግበሪያ እንደገና ማተምን ይሸፍናል። ከማስተካከያው በፊት ሁለት ማሰማራቶችን ቆጠረ፣ ከዚያ በኋላ አንድ።
ስክሪፕቱ የማምለጫ መንገዱንም ይሸፍናል፦ የመተግበሪያውን ረድፍ ለአስር ደቂቃ ያለ የልብ ምት በመገንባት ምልክት ያደርጋል፣ እንደገና ያትማል፣ እና አዲሱ ማተም ረድፉን ወስዶ እንደሚሠራ ያረጋግጣል።
የክፍል ፈተናዎቹ መቆለፊያው ሊያደርጋቸው የሚገቡትን ሁለት ነገሮች ይይዛሉ፦ ከሦስት በአንድ ጊዜ ከሚመጡ እንደገና ማተሞች ትክክለኛ አንዱ ብቻ ያልፋል፣ ሌሎቹ ሁለቱ ማተም እየሄደ መሆኑ ይነገራቸዋል፤ እና ባለቤቱ የሞተ ግንባታ ሊወሰድ ይችላል። ሌላ ፈተና አዲስ ሙከራ የቀድሞ ሙከራው የስህተት መልዕክት እንዳልያዘ ያረጋግጣል።
ከዚህ የወሰድነው
- የማጽጃ ኮድ በመደበቅ ውድድር ሊሆን ይችላል። «በመካሄድ ላይ ያለውን ሁሉ አልሳካ በል፣ ከዚያም ጀምር» ንጽህና የሚመስል ነው። ሁለት ጠሪዎች ሲኖሩ ግን እያንዳንዱ ሌላውን እየሰረዘ ነው።
- ዳታቤዙ እንዲፈርድ ፍቀድ። አንብብ-ከዚያም-ጻፍ ለሌላ ጥያቄ ክፍተት ይተዋል። አንድ ሁኔታዊ ማሻሻያ አይተውም።
- እያንዳንዱ መቆለፊያ ከሕይወት ምልክት ጋር የተያያዘ ጊዜ ማብቂያ ያስፈልገዋል። ያለ እሱ፣ ብልሽት ወደ የተጣበቀ መተግበሪያ ይቀየራል።
- የስህተት መልዕክቶች መመሪያዎች ናቸው። «ያ ስም ተይዟል» ሰዎችን የተሳሳተ ነገር እንዲያደርጉ ነግሯቸዋል። ትክክለኛው መልዕክት ቀላልና እውነት ነበር።
ስለ ማተም ተጨማሪ በሰነዶቹ ውስጥ፦ መተግበሪያን እንዴት ማተም እንደሚቻል። ተዛማጅ ማስተካከያም፦ የታተመ መተግበሪያህ እንደገና በማተም ጊዜ ይቆያል።