+− THE DAILY DIFFdev & AI news
SHIP IT

Shopifyk inbentario erreserbak MySQLra eraman zituen

Shopifyk bere inbentario erreserba sistema Redis-etik MySQL datu-basean sartu zuen, honek dagoeneko inbentario erregistroa zeukan.

Shopifyk bere inbentario erreserba sistema Redis-etik MySQL datu-basean sartu zuen, honek dagoeneko inbentario erregistroa zeukan. Banaka blokea daitezkeen unitate-lerroen igerileku mugatu batek aukera ematen die aldi bereko ordainketei SKIP LOCKED erabiltzeko eskubidea duten unitate desberdinak hautatzeko. Diseinua transakzio-mugaren, gako primarioaren diseinuaren, hornidura-arauen eta konexioaren atxikipen-denboraren behaketaren mende dago ordainketan zehar.

Irakurri idatzizko edizioa (ingelesez) ↗

Bideo honek zer jorratzen duen

  • Redis-eko kantitate-kontagailu eredu zaharrak konkurrentzia kudeatzen zuen, baina erreserbaren garbiketa eta MySQL erregistroaren eguneratzea ezin ziren transakzio atomiko lokal bakar batean partekatu.
  • Ordezkapenak eskuragarri dagoen unitate bakoitzeko errenkada bat erabiltzen du, elementu/kokapen konbinazio bakoitzeko 1.000ra mugatutako igerileku batean. Igerileku huts batek lerroko hornidura abiaraz dezake, eskaera konkurrentzialak hornidura blokeo baten atzean itxaroten duten bitartean.
  • Gako primario konposatua (shop_id, inventory_item_id, inventory_group_id, id) da. Shopifyk blokeo-gainkostua murriztu zuen bere prototipoan eta READ COMMITTED erabili zuen hornidura blokeatzen zuten hutsune-blokeoak saihesteko.
  • Erreserbako ezabatzeek igerileku-errenkadak ezabatzen dituzte erreserba-erregistroak sartu aurretik. Konpromisoak datu-baseko blokeoak askatzen ditu gordetako atxikipenak ordainketan zehar irauten duen bitartean; ordainketa arrakastatsuak erregistroa erreklamatzen du eta erreserba ezabatzen du geroago transakzio atomiko batean.
  • MySQL-ren dokumentuek SKIP LOCKED inkoherente ikuspegi gisa deskribatzen dute, blokeatutako errenkadak alde batera uzten dituena. Ez du stock kopuru osoa edo txanda-banaketa justua ezartzen, errenkada-mailako blokeoei soilik aplikatzen zaie eta ez da segurua adierazpenetan oinarritutako replikaziorako.
  • Iturburuko adibideak expires_at barne hartzen du, baina Shopifyk ez du MySQL-ren iraungitze-garbiketa algoritmoa dokumentatzen. Bideoaren askatze/iraungitze adarra azalpen-bizitza-zikloko eskakizun bat da.
  • Ordainketa-kodeko konexioaren atxikipen-denbora zen azken eraginkortasun-botila. Shopifyk bi sistemak itzalpean idatzi zituen, emaitzak alderatu zituen eta pixkanaka aldatu zen, Redis-en babes-etengailuarekin.

Itzulitako transkripzioa

Jatorrizko ingelesezko narraziotik itzulia. Eskuragarri dauden audioa eta azpitituluak YouTube-k kontrolatzen ditu.

Zergatik eraman erreserbak MySQLra?

0:00 Ordainketa batek Redis behar du azkarra izateko. Shopifyk inbentario erreserbak MySQLra eraman zituen, unitate bakoitzeko errenkada bat erabiliz igerileku mugatu batean. Zergatik aukeratu MySQL? Nola saihesten dira blokeoak segurtasunez? Hau The Daily Diff da, azaletik begiratuta. Eta zergatik jarraitzen zuten kontsulta azkarrek sabaia jotzen? Shopify online eta pertsonalki saltzeko merkataritza plataforma bat da. Redis memorian gordetako datu-base bat da.

0:21 MySQL datu-base erlazional bat da, eta Shopifyk dagoeneko bere inbentario-erregistroa bertan gordetzen zuen. Erreserba batek stocka laburki gordetzen du erosleak ordaintzen duen bitartean.

Zergatik ziren arriskutsuak bi denda?

0:29 Beraien Redis ereduak elementu-kontagailu bat jaitsi zuen. Ordaindutako eskaera bat erreklamatzeak MySQLko liburua eguneratzea eta Redis garbitzea esan nahi zuen. Idazketa bereizi horiek stocka bi aldiz saldu edo ez eskuragarri utzi zezaketen, salgarria izan behar zuenean. Eredu zaharrak kokapenaren kontzientzia ere falta zuen. Ordezkapenak eskaera bete dezakeen lekutik stocka aukeratu behar du. Kontinente okerrean dagoen biltegi batek datu-baseko sarrera bikaina egiten du, eta entrega-promesa izugarria. Aurreko MySQL saiakeretan kantitate-lerro bat erabiltzen zen, beraz, lehiatzen ziren ordainketak

Zein da blokea daitekeen unitatea?

0:56 blokeo berean ilaratu ziren. Pentsa ezazu belusezko soka bat kalkulu-orriaren gelaxka baten inguruan. Langile gehiago gehitzeak ilara luzatzen du soilik. Shopifyk blokea daitekeen objektua aldatu zuen. Eskuragarri dagoen unitate bakoitzak bere errenkada du. Blokeo-irakurketa batek beste transakzio batek hartzen dituen unitateak saltatzen ditu eta eskubidea duten beste unitate batzuk hautatzen ditu. Langile desberdinek errenkada desberdinak eskuratu ditzakete, kontagailu beroa haien bidetik kanpo dagoen bitartean.

Zer gertatzen da igerilekua husten denean?

1:15 Igerileku hori mila errenkadatan mugatuta dago elementu eta kokapen bakoitzeko. Hornidura liburutegitik dator. Hustutzen bada, erreserba bideak lerroan hornitzen du, lehiatzen diren eskaerak hornidura-blokeo baten atzean itxaroten duten bitartean. Igerileku hutsak ez du esan nahi biltegi hutsik. Erreserbak hautatutako igerileku-errenkadak ezabatzen ditu, gero erreserba-erregistroak transakzio batean sartzen ditu. Commit-ak datu-baseko blokeoak askatzen ditu.

1:35 Rollback-ek aldaketak desegiten ditu. Erreserbak ordainketa prozesatzea irauten du, gordetako egoera gisa. Ordainketa arrakastatsuak liburua erreklamatzen du eta erreserba atomikoki ezabatzen du. Datu-baseko blokeoek ez dute inoiz ordainketa-formularioa zaindu behar. Beraien gako primario konposatua denda, elementu, talde, gero unitate identitatearekin hasten da. Bilaketarekin bat etortzeak indize-blokeoa murriztu zuen haien prototipoan. Era berean, irakurketa konprometitua erabiltzen dute igerilekuaren hornidura blokeatzen zuten hutsune-blokeoak

1:57 saihesteko, eta taula-ordena koherentea zirkulu-itxaronak saihesteko. Argitaratutako adibideak iraungitze-denbora erregistratzen du. Utzitako ordainketek stocka azkenean askatu behar dute, bestela erosketa-gurdia jabe bihurtzen da. Shopifyren argitalpenak garbiketa-algoritmo hori zehaztugabe uzten du, beraz, diagrama honek bizitza-zikloko eskakizuna erakusten du. Hona hemen arazoa.

Zer uzten du kanpoan SKIP LOCKED komandoak?

2:14 Skip locked-ek blokeatutako errenkadak baztertzen ditu, beraz, eskuliburuak bere emaitza inkoherentea ikuspegi gisa deskribatzen du. Ez du stock-kopuru osoa edo txanda-banaketa justua ematen. Mantendu eskuragarritasun-erabakia eta hornidura-arauak haren inguruan.

Non zegoen benetako sabaia?

2:26 Eta sabaia hori? Beste ordainketa-kode batzuk datu-baseko konexioak denbora gehiegi mantentzen ari ziren. Shopifyk deitzaileak etiketatu zituen eta konexioaren atxikipen-denbora neurtu zuen, gero ordainketa-bidea garbitu eta hari-konkurrentzia berrikusi zuen. Kontsulta azkarrak kontsultatik kanpo ere ilaratu daitezke.

Zergatik bidaliko nuke diseinu hau?

2:38 Bi sistemak itzalpean idatzi zituzten, Redis agintaria zelarik, emaitzak alderatu zituzten, eta gero pixkanaka aldatu ziren eten-etengailu batekin. Nire epaia da bidali. Transakzio-muga partekatua eta itzulgarria den hedapena bidaliko nituzke, ordainketa-bide osoa instrumentatuta. Galderarik baduzu honi buruz? Idatzi iruzkinetan. Eta hori da gaurko ezberdintasuna.

2:54 Niko naiz Axrisitik. Batu arduraz.

Iturriak

  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

Lotutako bideoak