Shopify perkėlė atsargų rezervacijas į MySQL
Shopify perkėlė savo atsargų rezervavimo sistemą iš Redis į MySQL duomenų bazę, kurioje jau buvo atsargų registras.
Shopify perkėlė savo atsargų rezervavimo sistemą iš Redis į MySQL duomenų bazę, kurioje jau buvo atsargų registras. Ribotas individualiai užrakinamų vienetų eilučių telkinys leidžia lygiagretiems atsiskaitymams naudoti SKIP LOCKED, kad būtų pasirinkti skirtingi tinkami vienetai. Dizainas taip pat priklauso nuo operacijų ribų, pirminio rakto išdėstymo, papildymo taisyklių ir ryšio palaikymo laiko stebėjimo per atsiskaitymo procesą.
Skaityti rašytinę versiją (anglų k.) ↗
Kas aptariama šiame vaizdo įraše
- Senasis Redis kiekio skaitiklio modelis tvarkė lygiagretumą, tačiau rezervacijos išvalymas ir MySQL registro atnaujinimas negalėjo dalytis viena vietine atomine operacija.
- Pakeitimui naudojama viena eilutė vienam turimam vienetui telkinyje, kurio maksimalus dydis yra 1 000 vienetų vienam prekės/vietos deriniui. Tuščias telkinys gali inicijuoti tiesioginį papildymą, o lygiagretūs užklausos laukia už papildymo užrakto.
- Sudėtinis pirminis raktas yra (shop_id, inventory_item_id, inventory_group_id, id). Shopify sumažino užraktų išlaidas savo prototipe ir naudojo READ COMMITTED, kad išvengtų spragų užraktų, kurie blokavo papildymą.
- Rezervas ištrina telkinio eilutes prieš įterpiant rezervacijos įrašus. Įsipareigojimas atleidžia duomenų bazės užraktus, o saugomas rezervas išlieka per mokėjimą; sėkmingas mokėjimas pareikalauja registro ir pašalina rezervaciją vėlesne atomine operacija.
- MySQL dokumentuose SKIP LOCKED apibūdinamas kaip nenuoseklus vaizdas, kuriame praleidžiamos užrakintos eilutės. Jis nenustato visiško atsargų skaičiaus ar sąžiningos eilės, taikomas tik eilučių lygio užraktams ir yra nesaugus pareiškimais pagrįstai replikacijai.
- Šaltinio pavyzdyje yra expires_at, tačiau Shopify nedokumentuoja MySQL galiojimo pabaigos valymo algoritmo. Vaizdo įrašo išleidimo/galiojimo pabaigos šaka yra paaiškinamasis gyvavimo ciklo reikalavimas.
- Ryšio palaikymo laikas kitame atsiskaitymo kode buvo galutinis pralaidumo apribojimas. Shopify slaptai rašė į abi sistemas, palygino rezultatus ir palaipsniui perėjo su Redis avarinio išjungimo jungiklio atsarginiu variantu.
Išverstas transkriptas
Išversta iš originalo anglų kalbos. Galimas garso ir subtitrų valdymas per YouTube.
Kodėl perkelti rezervacijas į MySQL?
0:00 Atsiskaitymui reikia, kad Redis veiktų greitai. Shopify perkėlė atsargų rezervacijas į MySQL, naudodama po vieną eilutę vienam vienetui ribotame telkinyje. Kodėl pasirinkti MySQL? Kaip saugiai praleisti užraktus? Tai The Daily Diff, po gaubtu. Ir kodėl greitos užklausos vis dar atsitrenkdavo į lubas? Shopify yra prekybos platforma, skirta pardavimui internetu ir asmeniškai. Redis yra atmintyje esanti duomenų saugykla.
0:21 MySQL yra reliacinė duomenų bazė, ir Shopify jau laikė savo atsargų registrą joje. Rezervacija trumpam sulaiko atsargas, kol pirkėjas moka.
Kodėl dvi parduotuvės buvo rizikingos?
0:29 Jų Redis modelis mažino prekių skaitiklį. Apmokėto užsakymo patvirtinimas reiškė MySQL registro atnaujinimą ir Redis išvalymą. Šie atskiri įrašymai galėjo palikti atsargas parduotas du kartus arba nepasiekiamas, nors jos turėtų būti parduodamos. Senajam modeliui taip pat trūko vietos supratimo. Pakeitimas turi pasirinkti atsargas iš vietos, kuri gali įvykdyti užsakymą. Sandėlis netinkamame žemyne yra puikus duomenų bazės įrašas ir siaubingas pristatymo pažadas. Ankstesni MySQL bandymai naudojo kiekio eilutę, todėl konkuruojantys atsiskaitymai rikiavosi prie
Kas tampa užrakinamu vienetu?
0:56 to paties užrakto. Pagalvokite apie aksominę virvę aplink skaičiuoklės langelį. Pridėjus daugiau darbuotojų, tiesiog pailgėja eilė. Shopify pakeitė užrakinamą objektą. Kiekvienas turimas vienetas gauna savo eilutę. Užrakinantis skaitymas praleidžia vienetus, kuriuos kita operacija laiko, ir pasirenka kitus tinkamus vienetus. Skirtingi darbuotojai gali gauti skirtingas eilutes, o karštasis skaitiklis lieka nuošalyje.
Kas atsitinka, kai telkinys ištuštėja?
1:15 Šis telkinys yra ribojamas tūkstančiu eilučių vienai prekei ir vietai. Papildymas atliekamas iš registro. Jei jis ištuštėja, rezervavimo kelias papildo tiesiogiai, o konkuruojantys užklausos laukia už papildymo užrakto. Tuščias telkinys nereiškia tuščio sandėlio. Rezervas ištrina pasirinktas telkinio eilutes, tada įterpia rezervacijos įrašus operacijoje. Įsipareigojimas atleidžia duomenų bazės užraktus.
1:35 Atšaukimas anuliuoja pakeitimus. Rezervacija išlieka po mokėjimo apdorojimo kaip saugoma būsena. Sėkmingas mokėjimas pareikalauja registro ir atomiškai pašalina rezervaciją. Duomenų bazės užraktams niekada nereikia prižiūrėti mokėjimo formos. Jų sudėtinis pirminis raktas prasideda nuo parduotuvės, prekės, grupės, tada vieneto identifikatoriaus. Derinimas su paieška sumažino indeksų užrakinimą jų prototipe. Jie taip pat naudoja READ COMMITTED, kad išvengtų spragų užraktų, kurie blokavo telkinio
1:57 papildymą, ir nuoseklią lentelės tvarką, kad būtų išvengta cikliškų laukimų. Paskelbtame pavyzdyje įrašomas galiojimo laikas. Apleistiems mokėjimams galiausiai reikia atlaisvinti atsargas, antraip pirkinių krepšelis tampa nuomotoju. Shopify įraše tas valymo algoritmas nėra nurodytas, todėl ši diagrama rodo gyvavimo ciklo reikalavimą. Štai ir esmė.
Ką palieka SKIP LOCKED?
2:14 Skip locked pašalina užrakintas eilutes, todėl vadove jo rezultatas vadinamas nenuosekliu vaizdu. Jis nepateikia nei išsamaus atsargų skaičiaus, nei sąžiningos eilės. Palaikykite prieinamumo sprendimą ir papildymo taisykles aplink jį.
Kur buvo tikrosios lubos?
2:26 O tos lubos? Kitas atsiskaitymo kodas per ilgai laikė duomenų bazės ryšius. Shopify žymėjo skambintojus ir matavo ryšio palaikymo laiką, tada sutvarkė atsiskaitymo kelią ir peržiūrėjo gijų lygiagretumą. Greitos užklausos vis dar gali rikiuotis už užklausos.
Kodėl aš turėčiau išleisti šį dizainą?
2:38 Jie slaptai rašė į abi sistemas, kai Redis buvo autoritetingas, palygino rezultatus, tada palaipsniui perėjo su avarinio išjungimo jungikliu. Mano verdiktas yra SHIP IT. Aš siųsčiau bendrą operacijos ribą ir tą atšaukiamą išleidimą, su visu atsiskaitymo keliu instrumentuotu. Turite klausimų apie tai? Įrašykite juos komentaruose. Ir tai šiandienos skirtumas.
2:54 Aš Niko iš Axrisi. Sujunkite atsakingai.
Šaltiniai
- We replaced Redis with MySQL for inventory reservations—and it scaledShopify Engineering — Emilie Noel
- Simplified reservation SQL embedded in Shopify's articleShopify Engineering / CourtneySymons on GitHub Gist
- MySQL 8.0 — Locking ReadsOracle / MySQL Reference Manual
- MySQL 8.0 — Transaction Isolation LevelsOracle / MySQL Reference Manual
- What Is Shopify and How Does It Work?Shopify
- Redis quick startsRedis documentation
- What is MySQL?Oracle / MySQL Reference Manual



