Kukamata Apps Zinazoanguka Mara Tu Baada ya Kuchapishwa
Tarehe 25 Septemba, publishes tatu ziliwekwa alama kuwa zimefanikiwa, ingawa API ya app ilianguka sekunde chache baada ya kila kuanza. Kwa sababu zilifanikiwa, rollback haikuendeshwa; ukaguzi wa usuli ulizishindwa dakika chache baadaye, na tovuti nzima ikaenda 404. Health check ilikuwa inahesabu ajali kwenye orodha ya matukio ya jukwaa la hosting — ambayo hushikilia matukio matano ya mwisho kwa kila mashine, kwa hiyo mzunguko wa ajali unaijaza, na hesabu haikui kamwe. Sasa inalinganisha wakati wa ajali mpya zaidi badala yake, na publish inayoanguka mfululizo inashindwa na kurejesha toleo la awali.
Publish inasubiri nini
Unapochapisha app yenye backend kwenye Mythex, toleo jipya linasambazwa kwenye mashine za jukwaa letu la hosting, na health check ndiyo inayoamua kama publish imeenda hai au imeshindwa. Ikishindwa, rollback inarudisha toleo la awali.
Jambo gumu ni kwamba "imeanza" si sawa na "inahudumia". Jukwaa linaripoti mashine kuwa imeanza mara tu inapoinuka. App inayoanguka sekunde moja baada ya kuanza inaanzishwa upya mara moja, na baada ya muda mfupi inaonekana tena kama imeanza. Kwa hiyo health check ilikuwa imekua tabaka kadhaa kwa muda:
- Angalia mara mbili. Baada ya mashine kuonekana imeanza, subiri kidogo kisha angalia tena. Ajali ya kuanza mara nyingi hushindwa kwenye ukaguzi wa pili.
- Tazama mizunguko ya ajali. Jukwaa likiripoti kwamba mashine iliendelea kuanguka na ikaacha kuianzisha upya, shindwa.
- Hesabu ajali tangu publish ilipoanza. Maangalizi mawili ya "imeanza" yanaweza kuvuka wakati wa kuanzishwa upya. Kwa hiyo ikiwa ajali yoyote ilitokea tangu publish hii ianze, angalia mara ya tatu; ikiwa kuna ajali nyingi kuliko kwenye ukaguzi uliopita, app haidumu kuwa hai.
Ukaguzi wa tatu ndio uliokuwa umeshindwa hapa.
Kwa nini hesabu ilibaki ile ile
Taarifa za ajali zinatoka kwenye orodha ya matukio ya kila mashine: kuanza, kutoka, kuanzishwa upya. Jukwaa linahifadhi matukio matano ya mwisho tu kwa kila mashine.
Fikiria app inayoanguka sekunde 2.5 baada ya kila kuanza, kama mojawapo ilivyokuwa. Kila mzunguko unaongeza ajali moja na kuanza moja. Baada ya mizunguko michache, orodha imejaa. Kuanzia hapo, kila tukio jipya linasukuma tukio la zamani nje. Orodha inateleza mbele, lakini kila wakati inashikilia mchanganyiko ule ule: ajali mbili hivi, na kuanza mbili hivi.
Kwa hiyo "ajali ngapi tangu publish ilipoanza" ilirudisha namba ile ile kila kukaguliwa. Ukaguzi wa pili uliona, tuseme, ajali mbili. Wa tatu pia uliona ajali mbili — ajali tofauti, lakini namba ile ile. Ukaguzi ulihitimisha kwamba kuanguka kumesimama, na ukapitisha publish.
Hilo lilitokea mara tatu tarehe 25 Septemba, kwenye apps mbili. Kila mara:
- publish iliwekwa alama kuwa hai,
- rollback haikuendeshwa, kwa sababu hakuna kilichoshindwa,
- mchakataji wetu wa upatanisho, kazi ya usuli inayokagua deployments baada ya ukweli, uliishindwa deployment dakika chache baadaye,
- na tovuti nzima ilirudisha 404.
Publish inayoshindwa kwa wakati inaweza kurekebishika: rollback inarudisha toleo la awali. Publish inayoshindwa dakika chache kuchelewa, baada ya kutangazwa kuwa mafanikio, tayari imeruka rollback yake.
Tulivyoipata
Tulirudia kwa ndani: tulichukua API inayofanya kazi, tukaiacha ilale, kisha tukaichapisha tena na mabadiliko yanayoanguka kwenye kuanza. Health check iliiweka kuwa hai.
Hilo lililingana na production: katika kila moja ya publishes tatu, app ilikufa sekunde chache baada ya kila kuanza, lakini hesabu ya ajali ambayo ukaguzi uliilinganisha haikuwahi kupanda kati ya maangalizi.
Marekebisho: linganisha ajali mpya zaidi, si hesabu
Badala ya kuhesabu ajali, ukaguzi sasa unaangalia wakati wa ajali ya hivi karibuni tangu publish ilipoanza.
Ikiwa ukaguzi wa pili unaonyesha ajali yoyote tangu publish ianze, ukaguzi unasubiri na kuangalia mara ya tatu. Ikiwa ajali mpya zaidi kwenye ukaguzi wa tatu iko baadaye kuliko ajali mpya zaidi kwenye wa pili, mashine ilianguka tena katikati. Haidumu kuwa hai, na publish inashindwa na ujumbe unaosema kwamba mashine ilianguka mara kwa mara tangu kuchapisha na bado inaanzishwa upya.
Hii inafanya kazi bila kujali orodha ya matukio ni fupi kiasi gani. Dirisha la matukio matano linaweza kuficha ni ajali ngapi zilitokea, lakini haliwezi kuficha kwamba mpya imetokea — tukio jipya zaidi ndilo daima linalobaki.
Kwa mabadiliko haya, kuiga kwetu kwa ndani kunafanya kazi ipasavyo: publish inashindwa, na picha ya awali inarudishwa. Pia kuna jaribio linaloiga tabia ya jukwaa — kila maangalizi yanaongeza ajali na kuanza, na kupunguza orodha hadi tano — na kuthibitisha kwamba hukumu ni kushindwa, si kupita.
Tulichojifunza
- Jua umbo la data unayohesabu. Hesabu juu ya orodha yenye kikomo haina maana tena orodha ikijaa. Kikomo hakikufichwa; tulikuwa hatujabuni ukaguzi kwa kuzingatia kikomo hicho.
- Pendelea "kuna kitu kipya kimetokea?" kuliko "vingapi vimetokea?" Muhuri wa wakati wa mwisho unanusurika kukatwa; jumla hainusurika.
- Kushindwa kuchelewa ni mbaya zaidi kuliko kushindwa mapema. Build ile ile iliyovunjika haina madhara ikiwa publish inashindwa na kurudi nyuma, lakini inaondoa tovuti ikiwa imetangazwa kuwa mafanikio kwanza.
- Jaribu kwa hali halisi. Hitilafu ilihitaji mashine ambayo tayari imeanguka mara za kutosha kujaza orodha yake ya matukio. Ajali moja ya haraka kwenye jaribio isingeonyesha tatizo hili.
Marekebisho haya yanaenda pamoja na mengine ya siku hiyo hiyo, yaliyohakikisha rollback inarudisha toleo la zamani badala ya kulifuta: republish iliyoshindwa haifuti backend inayofanya kazi. Ikiwa app yako mwenyewe inashindwa kuchapishwa kwa sababu inaanguka inapoanza, docs za utatuzi wa publish na mwongozo wetu wa kurekebisha app iliyojengwa kwa AI ni sehemu nzuri za kuanzia.