Að ýta tvisvar á Birta birtir nú aðeins einu sinni
Þrjár birtingarbeiðnir fyrir sama app bárust API-inu okkar með 84 millisekúndna millibili, og hver þeirra ræsti heila útgáfu á appinu. Þær kepptust um sama hýsinguna, og nokkrar af útgáfunum mistókust því önnur hafði komist þangað fyrst. Eina sýnilega merkið var tölvupóstur um „útgáfu mistókst“ — appið sjálft endaði í lagi. Nú ræsir birting sem kemur á meðan önnur er í gangi fyrir sama app ekki aðra byggingu. Gagnagrunnurinn ákveður hvaða beiðni vinnur, og hinar fá að vita hið sanna: birting er þegar í gangi.
Hvað gerðist
Þegar þú birtir app á Mythex skráir API-ið útgáfu fyrir það og biður orkestrann okkar — þjónustuna sem keyrir byggingar — um að byggja og gefa það út. Birting getur hafist með hnappinum Birta, úr öðrum vafraflipa, eða frá agentinum þegar þú biður hann um að birta. Tvísmellur, tveir flipar, eða agentbeiðni sem berst tvisvar geta öll búið til fleiri en eina birtingu fyrir sama app nánast á sama augnabliki.
Í þessu tilviki bárust þrjár innan 84 ms. Hver keyrði heila útgáfu. Á hýsingarvettvanginum voru útgáfur fyrir sama app búnar til á sömu sekúndu, og þrjár þeirra mistókust því hinar voru þegar í gangi. Síðari útgáfa festist, og appið virkaði eftir á.
Það gerði þetta auðvelt að missa af. Notandinn sá eitt virkt app. Villurnar birtust aðeins sem tölvupóstar um mistök í útgáfu.
Af hverju ekkert stoppaði þetta
Birtingarkóðinn hafði skref sem leit á útgáfur í gangi fyrir verkefnið. En það sem það gerði var að merkja hverja útgáfu í gangi sem mistekna áður en ný hófst — „yfirtekin af nýrri birtingu“. Það átti að hreinsa upp byggingar sem skildar voru eftir af hrundu ferli.
Í reynd þýddi það að önnur birting sem kom meðan bygging stóð yfir lýsti þeirri fyrri dauðri og ræsti sína eigin. Báðar keyrðu til enda gagnvart sama appinu. Það var enginn lás; það var skref sem ruddi virkan brautina fyrir kapphlaup.
Það var annað, undarlegra einkenni við fyrstu birtingu app. Án útgáfuskráar til að endurnýta reyndu tvær samtímis fyrstu birtingar báðar að setja inn eina. Gagnagrunnurinn hefur einstakt auðkenni á tengiheiti appsins (slóðarheitið þess, eins og your-app í your-app.mythex.ai), svo seinni innsetningin mistókst. API-ið þýddi það sem „það tengiheiti er þegar í notkun“ — og ráðlagði notandanum að endurnefna app sem á þeirri stundu birti sig þegar í lagi undir því nafni.
Lagfæringin: krafan er læsingin
Að krefjast útgáfuskrárinnar er nú ein skilyrt gagnagrunnsuppfærsla: taktu þessa röð og merktu hana sem í smíðum aðeins ef enginn er að birta hana. Þar sem þetta er ein skipun ræður gagnagrunnurinn við beiðnir sem berast á sömu millisekúndu. Nákvæmlega ein þeirra breytir röðinni. Hinar sjá að engar raðir breyttust, hætta, og ná aldrei til orkestrans.
Lás þarf líka leið út þegar eigandinn deyr. Ef API-ið endurræstist mitt í birtingu yrði röðin áfram merkt „í smíðum“ að eilífu og appið væri óbirtanlegt. Svo röð þar sem eigandinn hefur hætt að senda hjartslátt — birtingin í gangi uppfærir röðina á 30 sekúndna fresti, og fimm mínútna þögn telst dauð — má krefja aftur. Þessi þröskuldur kemur frá hjartslættinum, ekki frá giski á hversu langan tíma bygging tekur. Að byggja eigin Dockerfile notanda getur tekið langan tíma og hæg bygging sem er enn að senda hjartslátt heldur kröfunni sinni.
Skrefið sem merkti allar útgáfur í gangi sem mistekna keyrir ekki lengur áður en birting hefst. Aðeins raðir sem dautt ferli skildi eftir eru hreinsaðar.
Að segja þeim sem tapar satt
Beiðnin sem tapar fær nú skýrt svar: publish_in_progress, ásamt auðkenni útgáfunnar sem er í gangi. Hver staður sem getur hafið birtingu meðhöndlar það:
- Vinnusvæðið fylgir byggingunni sem þegar er í gangi í stað þess að sýna villu yfir henni.
- Agentinn er látinn vita að birting þessa apps sé þegar í gangi og að hann eigi að bíða eftir henni, í stað þess að vera sagt að eitthvað hafi mistekist — sem áður gat sent hann í að „laga“ Dockerfile og reyna aftur.
- Árekstur við fyrstu birtingu á tengiheitinu er athugaður: ef röðin sem heldur nafninu er eigin birting verkefnisins í gangi, er svarið „er þegar að birta“, ekki „það nafn er í notkun“. Raunverulegur árekstur við annað verkefni fær enn skilaboðin um endurnefningu.
Hvernig við prófuðum það
Við skrifuðum endurtekningarskriftu sem keyrir þrjár birtingar á einu appi samtímis gegn raunverulegum gagnagrunni og hermi-orkestra, og telur hversu margar útgáfur orkestrinn er beðinn um. Hún nær yfir fyrstu birtingu og endurbirtingu lifandi apps. Fyrir lagfæringuna taldi hún tvær útgáfur. Eftir hana eina.
Skriftan nær líka yfir neyðarútgönguna: hún merkir röð appsins sem í smíðum án hjartsláttar í tíu mínútur, birtir aftur og athugar að nýja birtingin nái í röðina og keyri.
Einingapróf halda læsingunni við þau tvö atriði sem lás verður að gera: af þremur samtímis endurbirtingum kemst nákvæmlega ein í gegn og hinar tvær fá að vita að birting sé í gangi; og bygging sem eigandinn dó í má krefja. Annað próf athugar að ný tilraun beri ekki með sér villuskilaboð fyrri tilraunar.
Það sem við lærðum
- Hreinsunarkóði getur verið kapphlaup í dulargervi. „Mistakast allt sem er í gangi, byrjaðu síðan“ lítur út eins og hreinlæti. Með tveimur kallendum er það hver og einn að hætta við hinn.
- Láttu gagnagrunninn ráða. Lestur og síðan skrifun skilur eftir bil fyrir aðra beiðni. Ein skilyrt uppfærsla gerir það ekki.
- Sérhver lás þarf útrunnun tengda lífsmerkjum. Án hennar verður hrun að föstu appi.
- Villuskilaboð eru fyrirmæli. „Það nafn er í notkun“ sagði fólki að gera rangt. Rétta skilaboðin voru einfaldari og sönn.
Meira um birtingu í skjölunum: hvernig þú birtir. Og tengd lagfæring: birt appið þitt helst uppi meðan þú birtir það aftur.