Shopify je premjestio rezervacije inventara u MySQL
Shopify je premjestio svoj sustav rezervacija inventara iz Redisa u MySQL bazu podataka koja je već sadržavala evidenciju inventara.
Shopify je premjestio svoj sustav rezervacija inventara iz Redisa u MySQL bazu podataka koja je već sadržavala evidenciju inventara. Ograničen skup pojedinačno zaključavajućih redaka jedinica omogućuje 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 držanja veze tijekom naplate.
Pročitajte pisano izdanje (engleski) ↗
Što ovaj video pokriva
- Stari model brojača količina u Redisu rukovao je istovremenošću, ali čišćenje rezervacija i ažuriranje evidencije u MySQL-u nisu mogli dijeliti jednu lokalnu atomsku transakciju.
- Zamjena koristi jedan redak po raspoloživoj jedinici u skupu ograničenom na 1.000 po kombinaciji artikla/lokacije. Prazan skup može pokrenuti unutarnju 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.
- Rezervacija briše retke skupova prije umetanja zapisa rezervacija. Potvrđivanje otpušta zaključavanja baze podataka dok pohranjeno držanje traje tijekom plaćanja; uspješno plaćanje zahtijeva evidenciju i uklanja rezervaciju u kasnijoj atomskoj transakciji.
- MySQL dokumentacija navodi SKIP LOCKED kao nedosljedan prikaz koji izostavlja zaključane retke. Ne uspostavlja potpunu evidenciju zaliha niti pravedan redoslijed, primjenjuje se samo na zaključavanja na razini retka i nesiguran je za replikaciju temeljenu na izjavama.
- Izvorni primjer uključuje expires_at, ali Shopify ne dokumentira MySQL algoritam čišćenja isteka. Grana za izdanje/istek u videu je zahtjev za objašnjenje životnog ciklusa.
- Vrijeme držanja veze u drugom kodu za naplatu bilo je konačno usko grlo propusnosti. Shopify je paralelno pisao oba sustava, usporedio rezultate i postupno se prebacio s povratnim prekidačem za isključivanje Redisa.
Prevedeni transkript
Prevedeno iz izvornog engleskog pripovijedanja. Dostupni zvuk i titlovi kontroliraju se putem YouTubea.
Zašto premjestiti rezervacije u MySQL?
0:00 Naplata treba Redis da bi ostala brza. Shopify je premjestio rezervacije inventara u MySQL koristeći jedan redak po jedinici u ograničenom skupu. 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 prepreku? Shopify je platforma za trgovinu za online i osobnu prodaju. Redis je podatkovna pohrana u memoriji.
0:21 MySQL je relacijska baza podataka, a Shopify je već čuvao svoju evidenciju inventara tamo. Rezervacija kratko zadržava zalihe dok kupac plaća.
Zašto su dvije pohrane bile rizične?
0:29 Njihov Redis model smanjivao je brojač stavki. Potvrđivanje plaćene narudžbe značilo je ažuriranje evidencije u MySQL-u i čišćenje Redisa. Ta odvojena pisanja mogla su ostaviti zalihe prodane dvaput ili nedostupne kada bi trebale biti prodajne. Stari model također nije imao svijest o lokaciji. Zamjena mora odabrati zalihe s nekog mjesta koje može ispuniti narudžbu. Skladište na pogrešnom kontinentu čini izvrstan unos u bazu podataka i užasno obećanje o isporuci. Raniji pokušaji s MySQL-om koristili su redak količine, pa su se konkurentske naplate redale na
Što postaje jedinica koja se može zaključati?
0:56 istoj bravi. Zamislite baršunastu vrpcu oko ćelije proračunske tablice. Dodavanje više radnika samo produljuje red. Shopify je promijenio objekt koji se može zaključati. Svaka dostupna jedinica dobiva svoj redak. Zaključavanje čitanja preskače jedinice koje drugi transakcija drži i odabire druge raspoložive jedinice. Različiti radnici mogu dobiti različite retke, dok im vrući brojač ne smeta.
Što se događa kada se skup isprazni?
1:15 Taj je skup ograničen na tisuću redaka po stavci i lokaciji. Nadopuna se povlači iz evidencije. Ako se isprazni, put rezerve nadopunjuje se unutar reda, s konkurentskim zahtjevima koji čekaju iza brave za nadopunu. Prazan skup ne znači prazno skladište. Rezervacija briše odabrane retke skupova, a zatim umeće zapise rezervacija u transakciji. Potvrđivanje otpušta zaključavanja baze podataka.
1:35 Poništavanje poništava promjene. Rezervacija preživljava obradu plaćanja kao pohranjeno stanje. Uspješno plaćanje zahtijeva evidenciju i atomski uklanja rezervaciju. Zaključavanja baze podataka nikada ne moraju nadzirati obrazac za plaćanje. Njihov kompozitni primarni ključ počinje s trgovinom, stavkom, grupom, a zatim identitetom jedinice. Usklađivanje pretraživanja smanjilo je indeksno zaključavanje u njihovom prototipu. Također koriste read committed kako bi izbjegli zaključavanja praznina koja su blokirala nadopunu
1:57 skupa, i dosljedan redoslijed tablica kako bi spriječili kružna čekanja. Objavljeni primjer bilježi vrijeme isteka. Napuštena plaćanja s vremenom moraju osloboditi zalihe, inače košarica postaje iznajmljivač. Shopifyjev post ostavlja taj algoritam čišćenja neodređenim, pa ovaj dijagram prikazuje zahtjev životnog ciklusa. Evo kvake.
Što SKIP LOCKED izostavlja?
2:14 Skip locked isključuje zaključane retke, pa priručnik njegov rezultat naziva nedosljednim prikazom. Ne pruža ni potpunu evidenciju zaliha ni pravedan redoslijed. Odluku o dostupnosti i pravila nadopune zadržite oko nje.
Gdje je bio pravi limit?
2:26 A taj limit? Drugi kod za naplatu predugo je držao veze s bazom podataka. Shopify je označio pozivatelje i izmjerio vrijeme držanja veze, zatim je očistio putanju naplate i ponovno razmotrio istovremenost niti. Brzi upiti i dalje se mogu redati izvan upita.
Zašto bih objavio ovaj dizajn?
2:38 Oni su paralelno pisali oba sustava s Redisem kao autoritativnim, usporedili rezultate, a zatim se postupno prebacili s prekidačem za isključivanje. Moja presuda je SHIP IT. Objavio bih zajedničku granicu transakcije i to poništivo uvođenje, s instrumentiranom cijelom putanjom naplate. Imate pitanje o ovome? Stavite ga u komentare. I to je diff za danas.
2:54 Ja sam Niko iz Axrisija. Spajajte 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



