Shopify je premaknil rezervacije zalog v MySQL
Shopify je svoj sistem rezervacij zalog premaknil iz Redisa v bazo podatkov MySQL, ki je že vsebovala glavno knjigo zalog.
Shopify je svoj sistem rezervacij zalog premaknil iz Redisa v bazo podatkov MySQL, ki je že vsebovala glavno knjigo zalog. Omejen nabor posamezno zaklenljivih vrstic enot omogoča sočasnim plačilom uporabo SKIP LOCKED za izbiro različnih primernih enot. Zasnova je odvisna tudi od meja transakcij, postavitve primarnega ključa, pravil za dopolnjevanje in opazovanja časa zadržanja povezave med plačilom.
Preberi pisno izdajo (angleščina) ↗
Kaj zajema ta videoposnetek
- Stari model štetja količine v Redisu je obravnaval sočasnost, vendar čiščenje rezervacij in posodobitev glavne knjige MySQL nista mogli deliti ene same lokalne atomske transakcije.
- Zamenjava uporablja eno vrstico na razpoložljivo enoto v naboru, omejenem na 1.000 na kombinacijo artikla/lokacije. Prazen nabor lahko sproži vmesno dopolnjevanje s sočasnimi zahtevami, ki čakajo za ključavnico za dopolnjevanje.
- Sestavljeni primarni ključ je (shop_id, inventory_item_id, inventory_group_id, id). Shopify je zmanjšal stroške zaklepanja v svojem prototipu in uporabil READ COMMITTED, da bi se izognil vrzeli med zaklepanjem, ki je blokirala dopolnjevanje.
- Rezerva izbriše vrstice v naboru, preden vstavi zapise rezervacij. Potrditev sprosti zaklepanje baze podatkov, medtem ko se shranjeno zadržanje ohrani med plačilom; uspešno plačilo zahteva glavno knjigo in odstrani rezervacijo v kasnejši atomski transakciji.
- Dokumentacija MySQL opisuje SKIP LOCKED kot nedosleden pogled, ki izpušča zaklenjene vrstice. Ne vzpostavlja popolnega štetja zalog ali poštenega zaporedja, velja samo za zaklepanje na ravni vrstice in je nevaren za replikacijo na podlagi izjav.
- Primer v viru vključuje expires_at, vendar Shopify ne dokumentira algoritma čiščenja poteka v MySQL. Veja sprostitve/poteka v videoposnetku je pojasnilna zahteva življenjskega cikla.
- Čas zadržanja povezave v drugi kodi za plačilo je bil končno ozko grlo prepustnosti. Shopify je v senci zapisoval oba sistema, primerjal rezultate in postopoma preklopil z rezervnim stikalom za izklop Redisa.
Preveden prepis
Prevedeno iz izvirnega angleškega pripovedovanja. Razpoložljivi zvok in podnapisi so nadzorovani s strani YouTuba.
Zakaj premakniti rezervacije v MySQL?
0:00 Plačilo potrebuje Redis, da ostane hitro. Shopify je premaknil rezervacije zalog v MySQL z uporabo ene vrstice na enoto v omejenem naboru. Zakaj izbrati MySQL? Kako varno preskočite zaklepanja? To je The Daily Diff, pod pokrovom. In zakaj so hitre poizvedbe še vedno dosegle strop? Shopify je platforma za e-trgovino za spletno in osebno prodajo. Redis je podatkovna baza v pomnilniku.
0:21 MySQL je relacijska baza podatkov, in Shopify je že hranil svojo glavno knjigo zalog tam. Rezervacija na kratko zadrži zalogo, medtem ko kupec plača.
Zakaj sta bili dve shranjevanji tvegani?
0:29 Njihov model Redis je zmanjšal števec artiklov. Potrditev plačanega naročila je pomenila posodobitev glavne knjige MySQL in čiščenje Redisa. Te ločene zapise bi lahko pustile zalogo dvakrat prodano ali nedostopno, ko bi morala biti prodajna. Stari model tudi ni imel zavedanja o lokaciji. Zamenjava mora izbrati zalogo od nekje, ki lahko izpolni naročilo. Skladišče na napačni celini je odličen vnos v bazo podatkov in grozen obljuba dostave. Prejšnji poskusi MySQL so uporabili vrstico za količino, tako da so konkurenčna plačila čakala na isto
Kaj postane zaklenljiva enota?
0:56 ključavnico. Zamislite si žametno vrv okoli celice v preglednici. Dodajanje več delavcev samo podaljša čakalno vrsto. Shopify je spremenil zaklenljivi objekt. Vsaka razpoložljiva enota dobi svojo vrstico. Zaklenjeno branje preskoči enote, ki jih drži druga transakcija, in izbere druge primerne enote. Različni delavci lahko pridobijo različne vrstice, medtem ko vroči števec ostane izven njihove poti.
Kaj se zgodi, ko se nabor izprazni?
1:15 Ta nabor je omejen na tisoč vrstic na artikel in lokacijo. Dopolnjevanje črpa iz glavne knjige. Če se izprazni, pot rezerve dopolni vmes, s konkurenčnimi zahtevami čakanje za ključavnico za dopolnjevanje. Prazen nabor ne pomeni praznega skladišča. Rezerva izbriše izbrane vrstice v naboru, nato pa vstavi zapise rezervacij v transakcijo. Potrditev sprosti zaklepanje baze podatkov.
1:35 Razveljavitev razveljavi spremembe. Rezervacija preživi obdelavo plačila kot shranjeno stanje. Uspešno plačilo zahteva glavno knjigo in atomsko odstrani rezervacijo. Zaklepanja baze podatkov nikoli ne potrebujejo nadzorovanja obrazca za plačilo. Njihov sestavljeni primarni ključ se začne s trgovino, artiklom, skupino, nato identiteto enote. Ujemanje iskanja je zmanjšalo zaklepanje indeksov v njihovem prototipu. Uporabljajo tudi read committed, da se izognejo zaklepanju vrzeli, ki je blokiralo dopolnjevanje
1:57 nabora, in dosleden vrstni red tabel za preprečevanje krožnih čakanj. Objavljeni primer beleži čas poteka. Zapuščena plačila sčasoma potrebujejo sprostitev zaloge, sicer nakupovalna košarica postane lastnik. Objava Shopifyja pušča algoritem čiščenja nedoločen, tako da ta diagram prikazuje zahtevo življenjskega cikla. Tukaj je ulov.
Kaj izpusti SKIP LOCKED?
2:14 Skip locked izključuje zaklenjene vrstice, zato priročnik njegov rezultat imenuje nedosleden pogled. Ne zagotavlja niti popolnega štetja zalog niti poštenega izmenjavanja. Odločitev o razpoložljivosti in pravila dopolnjevanja naj ostanejo pri tem.
Kje je bil pravi strop?
2:26 In tisti strop? Druga koda za plačilo je predolgo držala povezave z bazo podatkov. Shopify je označil klicatelje in izmeril čas zadržanja povezave, nato pa očistil pot plačila in ponovno preveril sočasnost niti. Hitre poizvedbe se lahko še vedno znajdejo v čakalni vrsti izven poizvedbe.
Zakaj bi jaz poslal to zasnovo?
2:38 Oba sistema sta zapisovala v senci, pri čemer je bil Redis avtoritativen, primerjala rezultate, nato pa postopoma preklopila z izklopnim stikalom. Moja sodba je SHIP IT. Poslal bi skupno mejo transakcije in to razširitev, ki jo je mogoče razveljaviti, z instrumentirano celotno potjo plačila. Imate vprašanje o tem? Zapišite ga v komentarje. In to je razlika za danes.
2:54 Sem Niko iz Axrisija. Odgovorno združujte.
Viri
- 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



