Shopify je prebacio rezervacije inventara u MySQL
Shopify je prebacio svoj sistem rezervacija inventara iz Redisa u MySQL bazu podataka koja je već sadržala inventarsku knjigu.
Shopify je prebacio svoj sistem rezervacija inventara iz Redisa u MySQL bazu podataka koja je već sadržala inventarsku knjigu. Ograničen skup pojedinačno zaključavajućih redova jedinica omogućava istovremenim kupovinama da koriste SKIP LOCKED za odabir različitih raspoloživih jedinica. Dizajn takođe zavisi od granica transakcija, rasporeda primarnog ključa, pravila dopunjavanja i praćenja vremena zadržavanja veze tokom kupovine.
Pročitajte pisano izdanje (engleski) ↗
Šta ovaj video pokriva
- Stari model brojača količine u Redisu je rukovao istovremenošću, ali čišćenje rezervacija i ažuriranje MySQL knjige nisu mogli da dele jednu lokalnu atomsku transakciju.
- Zamena koristi jedan red po dostupnoj jedinici u grupi ograničenoj na 1.000 po kombinaciji artikla/lokacije. Prazna grupa može pokrenuti interno dopunjavanje sa istovremenim zahtevima koji čekaju iza brave za dopunjavanje.
- Kompozitni primarni ključ je (shop_id, inventory_item_id, inventory_group_id, id). Shopify je smanjio troškove zaključavanja u svom prototipu i koristio READ COMMITTED kako bi izbegao zaključavanja razmaka koja su blokirala dopunjavanje.
- Rezerva briše redove iz grupe pre umetanja zapisa rezervacija. Potvrda oslobađa brave baze podataka dok se zadržano stanje zadržava tokom plaćanja; uspešno plaćanje preuzima knjigu i uklanja rezervaciju u kasnijoj atomskoj transakciji.
- MySQL dokumentuje SKIP LOCKED kao nedosledan prikaz koji izostavlja zaključane redove. Ne uspostavlja potpunu evidenciju zaliha ili pravednu raspodelu redosleda, primenjuje se samo na zaključavanja na nivou reda i nesiguran je za replikaciju zasnovanu na izjavama.
- Primer izvora uključuje expires_at, ali Shopify ne dokumentuje MySQL algoritam čišćenja isteka. Grana za oslobađanje/istek u videu je objašnjenje zahteva životnog ciklusa.
- Vreme zadržavanja veze u drugom kodu za naplatu bio je konačno usko grlo u protoku. Shopify je istovremeno pisao u oba sistema, upoređivao rezultate i postepeno se prebacivao sa sigurnosnim prekidom na Redis.
Preveden transkript
Prevedeno sa originalne engleske naracije. Dostupan audio i titlovi kontrolisani su od strane YouTube-a.
Zašto prebaciti rezervacije u MySQL?
0:00 Naplata zahteva Redis da bi ostala brza. Shopify je prebacio rezervacije inventara u MySQL koristeći jedan red po jedinici u ograničenom pulu. Zašto odabrati MySQL? Kako sigurno preskočiti zaključavanja? Ovo je The Daily Diff, ispod haube. I zašto su brzi upiti i dalje nailazili na plafon? Shopify je platforma za trgovinu za prodaju online i lično. Redis je memorijska baza podataka.
0:21 MySQL je relacijska baza podataka, i Shopify je već čuvao svoju inventarsku knjigu tamo. Rezervacija kratko drži zalihe dok kupac plaća.
Zašto su dva skladišta bila rizična?
0:29 Njihov Redis model je smanjivao brojač artikala. Potraživanje plaćene narudžbine značilo je ažuriranje MySQL knjige i čišćenje Redisa. Ti odvojeni upisi mogli su ostaviti zalihe prodane dvaput ili nedostupne kada bi trebale biti prodajne. Stari model takođe nije imao svest o lokaciji. Zamena mora odabrati zalihe sa nekog mesta koje može ispuniti narudžbinu. Skladište na pogrešnom kontinentu čini odličan unos u bazu podataka i užasno obećanje isporuke. Raniji pokušaji sa MySQL-om su koristili red sa količinom, pa su se konkurentne naplate
Šta postaje jedinica koja se može zaključati?
0:56 ređale na istoj bravi. Zamislite plišanu traku oko ćelije tabele. Dodavanje više radnika samo produžava red. Shopify je promenio objekat koji se može zaključati. Svaka dostupna jedinica dobija svoj red. Čitanje sa zaključavanjem preskače jedinice koje druga transakcija drži i bira druge raspoložive jedinice. Različiti radnici mogu dobiti različite redove, dok im vrući brojač ne smeta.
Šta se dešava kada se grupa isprazni?
1:15 Taj bazen je ograničen na hiljadu redova po artiklu i lokaciji. Dopunjavanje se vrši iz knjige. Ako se isprazni, rezervni put se dopunjava interno, sa konkurentnim zahtevima koji čekaju iza brave za dopunjavanje. Prazan bazen ne znači prazno skladište. Rezerva briše odabrane redove iz bazena, zatim ubacuje zapise rezervacija u transakciju. Potvrda oslobađa brave baze podataka.
1:35 Poništavanje poništava promene. Rezervacija preživljava obradu plaćanja kao sačuvano stanje. Uspešno plaćanje preuzima knjigu i atomski uklanja rezervaciju. Zaključavanja baze podataka nikada ne moraju da nadziru obrazac za plaćanje. Njihov kompozitni primarni ključ počinje sa prodavnicom, artiklom, grupom, zatim identitetom jedinice. Poklapanje pretrage je smanjilo zaključavanje indeksa u njihovom prototipu. Takođe koriste read committed kako bi izbegli zaključavanja razmaka koja su blokirala
1:57 dopunjavanje bazena, i dosledan redosled tabela kako bi sprečili kružna čekanja. Objavljeni primer beleži vreme isteka. Napuštena plaćanja moraju na kraju osloboditi zalihe, ili korpa za kupovinu postaje iznajmljivač. Shopify-ev post ostavlja taj algoritam čišćenja nespecifikovanim, pa ovaj dijagram prikazuje zahtev životnog ciklusa. Evo kvake.
Šta SKIP LOCKED izostavlja?
2:14 Skip locked isključuje zaključane redove, pa priručnik njegov rezultat naziva nedoslednim prikazom. On ne pruža ni potpunu evidenciju zaliha ni pravednu raspodelu redosleda. Odluku o dostupnosti i pravila dopunjavanja držite oko toga.
Gde je bio stvarni plafon?
2:26 A taj plafon? Drugi kod za naplatu je predugo držao veze sa bazom podataka. Shopify je označavao pozivaoce i merio vreme zadržavanja veze, zatim je očistio putanju naplate i ponovo razmotrio istovremenost niti. Brzi upiti se i dalje mogu ređati izvan upita.
Zašto bih implementirao ovaj dizajn?
2:38 Istovremeno su pisali u oba sistema sa Redisom kao autoritativnim, upoređivali rezultate, a zatim postepeno prelazili sa prekidačem za isključivanje. Moja presuda je SHIP IT. Implementirao bih deljenu granicu transakcija i to povratno uvođenje, sa instrumentacijom celog puta naplate. Imate pitanje o ovome? Stavite ga u komentare. I to je razlika za danas.
2:54 Ja sam Niko iz Axrisija. Spojite odgovorno.
Izvori
- 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



