Blogg

Viðvaranir sem fara af stað einu sinni, ekki einu sinni á hvern netþjón

Ein af rekstrarviðvörunum okkar, „lág inneign“ fyrir birt forrit smiðs, á að berast okkur í mesta lagi einu sinni á dag. Einn eftirmiðdag barst hún fimm sinnum. Orsökin: hvert eintak af API-inu okkar mundi í eigin minni hvaða viðvaranir það hafði þegar sent, þannig að tveir netþjónar sendu hana tvisvar, og hver útgáfa þurrkaði það minni út og leyfði þeim að senda aftur. Sama mynstur olli því að bakgrunnsverk keyrði tvöfalt. Bæði samræma nú í gegnum sameiginlega geymslu, og bæði falla yfir á örugga hliðina ef hún er ekki tiltæk.

Einkennin

Mythex sendir viðvaranir á teymið þegar eitthvað þarf athygli: þjónusta liggur niðri, verk stöðvast, eða inneignastaða smiðs er að verða lág meðan forritið hans er birt. Hver viðvörun hefur tvíföldunargluggann sinn, tímabil þar sem sama viðvörun er aðeins send einu sinni. Fyrir lágu inneignaviðvörunina er gluggin 24 klukkustundir.

Fimm eintök af sömu viðvörun á einum eftirmiðdegi þýddi að glugginn hélt ekki. Verra var að þau komu í pörum, um 11 mínútum á milli.

Af hverju þetta gerðist

Viðvörunapakki okkar geymdi tvíföldunina í minni: töflu með „viðvörunarlykill → hvenær síðast var sent“, inni í keyrandi ferlinu. Það virkar þegar eitt ferli er til sem aldrei endurræsist. Framleiðslan hefur hvorugt:

  • Tveir API-afrit. Framleiðslan keyrir tvö eintök af API-inu. Hvort hafði sína töflu, þannig að hvort sendi viðvörunina einu sinni. Það eru pörin.
  • Útgáfur. Hver útgáfa skiptir báðum afritum út fyrir ný ferli með tómar töflur. Eftir útgáfu fór viðvörunin út aftur, eins og hún hefði aldrei verið send.

Þetta ~11 mínútna bil milli viðvaranna í hverju pari kom frá verkinu sem vekur þessa viðvörun. Það keyrir á báðum afritum og tekur lás, þannig að afritin skiptast á að vinna hann, og hvort um sig vakti viðvörunina þegar röðin kom að því.

Það var annar, hljóðlátari galli í sama kóða. Til að koma í veg fyrir að töflunni vaxi endalaust hreinsaði hún sjálfa sig þegar hún hafði 500 lykla, og eyddi öllum færslum eldri en 15 mínútum, óháð glugganum þeirra. Undir álagi gat 24 klukkustunda tvíföldun varað í fjórðung klukkustundar.

Lagfæringin

Ein sameiginleg skrá fyrir hverja viðvörun

Áður en API sendir viðvörun tekur það nú frá tvíföldunarlykil viðvörunarinnar í Redis, sameiginlegri minnisgeymslu sem bæði afritin tala við og endurræsist ekki þegar API endurræsist. Krafan er ein aðgerð: „settu þennan lykil aðeins ef hann er ekki til, og láttu hann renna út eftir gluggann“. Það afrit sem tekur hann fyrst sendir viðvörunina; hitt finnur lykilinn upptekinn og þegir. Nýtt ferli eftir útgáfu finnur lykilinn enn til staðar.

Lykillinn og glugginn koma úr sömu reglu og viðvörunapakkinn notar, nú deilt á milli þeirra, þannig að lögin tvö geta ekki verið ósammála um hvað telst „sama viðvörun“.

Falla opið, ekki lokað

Mikilvægasta ákvörðunin var hvað gera skyldi þegar ekki næst í Redis. Við völdum að senda viðvörunina samt. Ef Redis liggur niðri, eða svarar ekki innan 1,5 sekúndu, fer viðvörunin út. Tvöföld viðvörun er suð. Týnd viðvörun þýðir að einhver er ekki látinn vita.

Alvarlegustu viðvaranirnar, P0, eru aldrei haldið aftur af tvíföldun.

Hver færsla heldur sínum eigin glugga

Í eigin minnistvíföldun viðvörunapakkans geymir hver færsla nú hvenær glugginn hennar endar, og hreinsun fjarlægir aðeins færslur þar sem glugginn er liðinn. 24 klukkustunda lykill helst í 24 klukkustundir, sama hversu margar aðrar viðvaranir berast.

Sama galli, annars staðar

Sama mynstur hafði tvöfaldað stykki af bakgrunnsvinnu: samstillingarverk sem heldur skránni okkar um stöðu hvers vinnusvæðis í takt við sýndarvélaþjónustuna okkar. Hver umferð listar hverja sýndarvél á reikningnum, þúsundir í framleiðslu, um fimm sekúndur, auk hvers keyrandi eða pásaðs verkefnis. Bæði afrit keyrðu það á tveggja mínútna fresti.

Skrifin eru idempotent, sem þýðir að það að keyra þau tvisvar gefur sömu útkomu og einu sinni, þannig að ekkert brotnaði. Þetta var bara tvöföld vinna. Nú er hvert tveggja mínútna tímabil tekið í Redis á sama hátt og notkunarmælar okkar tóku þegar sínar, og aðeins það afrit sem tekur tímabilið keyrir umferðina. Ef ekki næst í Redis keyrir umferðin samt: að vinna verkið tvisvar er skaðlaust, að sleppa því ekki.

Hvernig við prófuðum þetta

Prófin líkja eftir raunverulegu uppsetningunni. Þau hlaða viðvörunareiningunni tvisvar, eins og tvö aðskilin „afrit“, benda þeim báðum á eina sameiginlega geymslu, kalla fram sömu viðvörun frá hvoru um sig, og hlaða síðan þriðja nýja eintakinu til að standa í stað „eftir útgáfu“ og kalla fram hana aftur. Nákvæmlega ein viðvörun er send. Önnur próf athuga að viðvörun annars smiðs fari enn út, að P0 sé sent frá báðum afritum, og að viðvörunin sé enn send þegar geymslan er niðri eða bíður lengur en tímamörkin. Hreinsunarlagfæringin hefur sitt eigið próf: 24 klukkustunda lykill lifir af 600 aðrar viðvaranir sem berast 20 mínútum síðar.

Fyrir endurstillingarverkið keyra tvö afrit sem tikka samtímis, auk þriðja tikks í sama glugga, eina samræmda lista.

Það sem við lærðum

  • Minni í einu ferli er bundið við ferlið. Allt sem verður að vera satt á milli netþjóna, „sent einu sinni“ eða „keyrt einu sinni“, þarf að eiga heima þar sem þeir deila því.
  • Útgáfur eru endurræsingar. Ástand sem lifir aðeins þar til næsta endurræsing lifir ekki af venjulegan vinnudag.
  • Ákveddu í hvora áttina á að falla. Fyrir viðvaranir ætti sameiginleg geymsla sem liggur niðri að þýða fleiri viðvaranir, ekki færri.
  • Leitaðu að mynstrinu, ekki bara tilvikinu. Viðvörunin var háværa dæmið; tvöfalda endurstillingarverkið var sami galli sem kostaði vinnu í hljóði.

Ekkert af þessu sést innan úr Mythex. Um meira um hvernig við höldum vettvangnum stöðugum, sjá hvernig við fórum niður í núll 502-villur við útgáfur og skiptiskráin sem vantaði. Ef þú ert nýr/ný í hugmyndinni um að keyra fleiri en eitt eintak af þjónustu, nær leiðbeiningin okkar um hvað netþjónn er grunnatriðunum.

Mythex · Pricing · Smíðaðu hvað sem er með gervigreind · Sniðmát fyrir vefsíður og forrit · Mythex í samanburði · Orðasafn um forritasmíði með gervigreind · Ókeypis verkfæri fyrir forritasmíði með gervigreind · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)