+− THE DAILY DIFFdev & AI news
SHIP IT

Shopify je prebacio rezervacije inventara u MySQL

Shopify je premjestio svoj sistem rezervacija inventara iz Redisa u MySQL bazu podataka koja je već sadržavala inventarnu knjigu.

Shopify je premjestio svoj sistem rezervacija inventara iz Redisa u MySQL bazu podataka koja je već sadržavala inventarnu knjigu. Ograničeni skup pojedinačno zaključavajućih redova jedinica omogućava istovremenim naplatama korištenje SKIP LOCKED za odabir različitih raspoloživih jedinica. Dizajn također ovisi o granicama transakcija, rasporedu primarnih ključeva, pravilima nadopune i promatranju vremena zadržavanja veze tijekom naplate.

Pročitajte pisano izdanje (engleski) ↗

Šta ovaj video pokriva

  • Stari Redis model brojača količine je obrađivao istovremenost, ali čišćenje rezervacija i ažuriranje MySQL knjige nisu mogli dijeliti jednu lokalnu atomsku transakciju.
  • Zamjena koristi jedan red po dostupnoj jedinici u bazenu ograničenom na 1.000 po kombinaciji artikla/lokacije. Prazan bazen može pokrenuti inline nadopunu s istovremenim zahtjevima koji čekaju iza brave za nadopunu.
  • 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 izbjegao zaključavanja praznina koja su blokirala nadopunu.
  • Rezerva briše redove bazena prije umetanja zapisa o rezervacijama. Potvrđivanje otpušta zaključavanja baze podataka dok pohranjeno zadržavanje traje kroz plaćanje; uspješno plaćanje preuzima knjigu i uklanja rezervaciju u kasnijoj atomskoj transakciji.
  • MySQL dokumenti SKIP LOCKED kao nedosljedan prikaz koji izostavlja zaključane redove. Ne uspostavlja potpunu evidenciju zaliha ili pravedno preuzimanje, primjenjuje se samo na zaključavanja na nivou reda i nije siguran za replikaciju zasnovanu na izjavama.
  • Izvorni primjer uključuje expires_at, ali Shopify ne dokumentira MySQL algoritam čišćenja isteka. Grana izdavanja/isteka u videu je zahtjev za objašnjavanje životnog ciklusa.
  • Vrijeme zadržavanja veze u drugom kodu za naplatu bio je konačni usko grlo propusnosti. Shopify je istovremeno pisao u oba sistema, uporedio rezultate i postepeno prešao s Redis prekidačem za isključenje kao rezervom.

Prevedeni transkript

Prevedeno iz originalne engleske naracije. Dostupan zvuk i titlovi kontroliše YouTube.

Zašto prebaciti rezervacije u MySQL?

0:00 Naplata treba Redis da ostane brza. Shopify je prebacio rezervacije inventara u MySQL koristeći jedan red po jedinici u ograničenom bazenu. 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 udarali u plafon? Shopify je trgovačka platforma za online i ličnu prodaju. Redis je memorijska pohrana podataka.

0:21 MySQL je relacijska baza podataka, a Shopify je već držao svoju inventarnu knjigu tamo. Rezervacija nakratko drži zalihe dok kupac plaća.

Zašto su dvije prodavnice bile rizične?

0:29 Njihov Redis model je smanjivao brojač artikala. Preuzimanje plaćene narudžbe značilo je ažuriranje MySQL knjige i čišćenje Redisa. Ti odvojeni upisi mogli su ostaviti zalihe prodatim dvaput ili nedostupnim kada bi trebale biti prodate. Stari model također nije imao svijest o lokaciji. Zamjena mora odabrati zalihe s mjesta koje može ispuniti narudžbu. Skladište na pogrešnom kontinentu je odličan unos u bazu podataka i užasno obećanje o isporuci. Raniji pokušaji s MySQL-om koristili su red količine, tako da su se konkurentske naplate redale na

Šta postaje zaključavajuća jedinica?

0:56 istoj bravi. Zamislite baršunasto uže oko ćelije proračunske tablice. Dodavanje više radnika samo produžuje red. Shopify je promijenio objekt zaključavanja. Svaka dostupna jedinica dobija svoj red. Zaključavajuće čitanje 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 bazen isprazni?

1:15 Taj bazen je ograničen na hiljadu redova po artiklu i lokaciji. Nadopuna se crpi iz knjige. Ako se isprazni, put rezerve nadopunjuje inline, s konkurentskim zahtjevima koji čekaju iza brave za nadopunu. Prazan bazen ne znači prazno skladište. Rezerva briše odabrane redove bazena, zatim umeće zapise o rezervacijama u transakciji. Potvrda otpušta zaključavanja baze podataka.

1:35 Poništenje poništava promjene. Rezervacija preživljava obradu plaćanja kao pohranjeno stanje. Uspješno plaćanje preuzima knjigu i atomski uklanja rezervaciju. Zaključavanja baze podataka nikada ne moraju čuvati obrazac za plaćanje. Njihov kompozitni primarni ključ počinje s trgovinom, artiklom, grupom, zatim identitetom jedinice. Podudaranje pretraživanja smanjilo je zaključavanje indeksa u njihovom prototipu. Također koriste read committed kako bi izbjegli zaključavanja praznina koja su blokirala nadopunu

1:57 bazena, i dosljedan redoslijed tablice kako bi spriječili kružna čekanja. Objavljeni primjer bilježi vrijeme isteka. Napuštena plaćanja trebaju da se zalihe na kraju otpuste, ili korpa za kupovinu postaje iznajmljivač. Shopifyjev post ostavlja taj algoritam čišćenja neodređenim, tako da ovaj dijagram prikazuje zahtjev životnog ciklusa. Evo kvake.

Šta SKIP LOCKED izostavlja?

2:14 Skip locked isključuje zaključane redove, pa priručnik njegov rezultat naziva nedosljednim prikazom. Ne pruža ni potpunu evidenciju zaliha ni pošteno preuzimanje. Odluku o dostupnosti i pravila nadopune držite oko toga.

Gdje je bio pravi plafon?

2:26 A taj plafon? Drugi kod za naplatu je predugo držao veze s bazom podataka. Shopify je označio pozivatelje i mjerio vrijeme zadržavanja veze, zatim očistio putanju naplate i ponovo razmotrio istovremenost niti. Brzi upiti i dalje mogu čekati u redu izvan upita.

Zašto bih isporučio ovaj dizajn?

2:38 Istovremeno su pisali u oba sistema s Redisom kao autoritativnim, uporedili rezultate, zatim postepeno prešli s prekidačem za isključenje. Moja presuda je SHIP IT. Isporučila bih zajedničku granicu transakcija i taj povratni postupak implementacije, s instrumentiranom cijelom putanjom naplate. Imate pitanje o ovome? Stavite ga u komentare. I to je to za The Daily Diff danas.

2:54 Ja sam Niko iz Axrisija. Spajajte odgovorno.

Izvori

  1. We replaced Redis with MySQL for inventory reservations—and it scaledShopify Engineering — Emilie Noel
  2. Simplified reservation SQL embedded in Shopify's articleShopify Engineering / CourtneySymons on GitHub Gist
  3. MySQL 8.0 — Locking ReadsOracle / MySQL Reference Manual
  4. MySQL 8.0 — Transaction Isolation LevelsOracle / MySQL Reference Manual
  5. What Is Shopify and How Does It Work?Shopify
  6. Redis quick startsRedis documentation
  7. What is MySQL?Oracle / MySQL Reference Manual

Povezani videozapisi