+− THE DAILY DIFFdev & AI news
SHIP IT

Shopify het voorraadreserverings na MySQL geskuif

Shopify het sy voorraadreserveringstelsel van Redis na die MySQL-databasis geskuif wat reeds die voorraadgrootboek gehou het.

Shopify het sy voorraadreserveringstelsel van Redis na die MySQL-databasis geskuif wat reeds die voorraadgrootboek gehou het. 'n Begrensde poel van individueel sluitbare eenheidrye laat gelyktydige afrekenings toe om SKIP LOCKED te gebruik om verskillende geskikte eenhede te kies. Die ontwerp hang ook af van transaksiegrense, primêre sleutel-uitleg, aanvullingsreëls en die waarneming van verbinding-hou-tyd oor die afrekening heen.

Lees die geskrewe uitgawe (Engels) ↗

Wat hierdie video dek

  • Die ou Redis-hoeveelheidteller-model het gelyktydigheid hanteer, maar reserveringsopruiming en die MySQL-grootboekopdatering kon nie 'n enkele plaaslike atoomtransaksie deel nie.
  • Die vervanging gebruik een ry per beskikbare eenheid in 'n poel wat beperk is tot 1 000 per item-/liggingkombinasie. 'n Leë poel kan inlyn-aanvulling met gelyktydige versoeke agter 'n aanvullingslot veroorsaak.
  • Die saamgestelde primêre sleutel is (shop_id, inventory_item_id, inventory_group_id, id). Shopify het slotoorhoofse in sy prototipe verminder en READ COMMITTED gebruik om gapinglotte wat aanvulling geblokkeer het, te vermy.
  • Reserve verwyder poelrye voordat reserveringsrekords ingevoeg word. Bevestiging stel databasis-slotte vry terwyl die gestoorde bespreking oor betaling voortduur; suksesvolle betaling eis die grootboek en verwyder die bespreking in 'n latere atoomtransaksie.
  • MySQL dokumenteer SKIP LOCKED as 'n inkonsekwente aansig wat geslote rye weglaat. Dit vestig nie 'n volledige voorraadtelling of billike beurt-neem nie, is slegs van toepassing op ry-vlak slotte en is onveilig vir stelling-gebaseerde replikasie.
  • Die bronvoorbeeld sluit expires_at in, maar Shopify dokumenteer nie die MySQL-verval-opruimingsalgoritme nie. Die video se vrystelling-/vervaltak is 'n verklarende lewensiklusterwiel.
  • Verbinding-hou-tyd in ander afrekeningskode was die finale deurvoervlaag. Shopify het albei stelsels skadu-geskryf, uitkomste vergelyk en geleidelik oorgeskakel met 'n Redis-noodskakelaar-terugval.

Vertaalde transkripsie

Vertaal uit die oorspronklike Engelse vertelling. Beskikbare klank en onderskrifte word deur YouTube beheer.

Waarom reserverings na MySQL skuif?

0:00 'n Afrekening benodig Redis om vinnig te bly. Shopify het voorraadreserverings na MySQL geskuif deur een ry per eenheid in 'n begrensde poel te gebruik. Waarom MySQL kies? Hoe oorslaan jy slotte veilig? Dit is The Daily Diff, onder die enjinkap. En waarom het vinnige navrae steeds 'n plafon getref? Shopify is 'n handelsplatform vir aanlyn en persoonlike verkope. Redis is 'n in-geheue databerging.

0:21 MySQL is 'n relasionele databasis, en Shopify het reeds sy voorraadgrootboek daar gehou. 'n Reservering hou kortliks voorraad vas terwyl 'n koper betaal.

Waarom was twee winkels riskant?

0:29 Hul Redis-model het 'n itemteller verminder. Om 'n betaalde bestelling te eis, het beteken om die MySQL-grootboek op te dateer en Redis op te ruim. Daardie aparte skrywes kon voorraad twee keer verkoop of onbeskikbaar laat wanneer dit verkoopbaar moes wees. Die ou model het ook liggingbewustheid ontbreek. Die vervanging moet voorraad kies van êrens wat die bestelling kan uitvoer. 'n Pakhuis op die verkeerde kontinent maak 'n uitstekende databasisinskrywing en 'n verskriklike afleweringsbelofte. Vroeër MySQL-pogings het 'n hoeveelheid-ry gebruik, so mededingende afrekenings het by dieselfde slot tougestaan.

Wat word die sluitbare eenheid?

0:56 Dink aan 'n fluweelkoord om 'n sigbladsel. Die byvoeging van meer werkers verleng net die tou. Shopify het die sluitbare voorwerp verander. Elke beskikbare eenheid kry sy eie ry. 'n Sluitende lees oorslaan eenhede wat 'n ander transaksie hou en kies ander geskikte eenhede. Verskillende werkers kan verskillende rye verkry, terwyl die warm teller uit hul pad bly.

Wat gebeur wanneer die poel leeg raak?

1:15 Daardie poel is beperk tot duisend rye per item en ligging. Aanvulling trek uit die grootboek. As dit leeg raak, vul die reservaatpad inlyn aan, met mededingende versoeke wat agter 'n aanvullingslot wag. Leë poel beteken nie leë pakhuis nie. Reserve verwyder geselekteerde poelrye, en voeg dan reserveringsrekords in 'n transaksie in. Bevestiging stel die databasis-slotte vry.

1:35 Terugrol maak die veranderinge ongedaan. Die reservering oorleef betalingsverwerking as gestoorde toestand. Suksesvolle betaling eis die grootboek en verwyder die reservering atoomlik. Databasis-slotte hoef nooit die betaalvorm dop te hou nie. Hul saamgestelde primêre sleutel begin met winkel, item, groep, dan eenheid-identiteit. Die passing van die opsoek het indeks-sluiting in hul prototipe verminder. Hulle gebruik ook 'read committed' om die gapinglotte wat poel-aanvulling geblokkeer het, te vermy,

1:57 en 'n konsekwente tabelvolgorde om omsendbriefwagte te voorkom. Die gepubliseerde voorbeeld teken 'n vervaltyd aan. Verlate betalings moet uiteindelik voorraad vrystel, anders word die inkopiemandjie 'n verhuurder. Shopify se pos laat daardie opruimingsalgoritme ongespesifiseer, so hierdie diagram toon die lewensiklusvereiste. Hier is die vangplek.

Wat laat SKIP LOCKED uit?

2:14 Skip locked sluit geslote rye uit, so die handleiding noem die resultaat 'n inkonsekwente aansig. Dit bied nóg 'n volledige voorraadtelling nóg billike beurt-neem. Hou die beskikbaarheidsbesluit en aanvullingsreëls daar rondom.

Waar was die ware plafon?

2:26 En daardie plafon? Ander afrekeningskode het databasisverbindings te lank gehou. Shopify het oproepers gemerk en verbinding-hou-tyd gemeet, toe die afrekeningspad skoongemaak en draadgelyktydigheid herbesoek. Vinnige navrae kan steeds buite die navraag toustaan.

Waarom sou ek hierdie ontwerp verskeep?

2:38 Hulle het albei stelsels skadu-geskryf met Redis gesaghebbend, uitkomste vergelyk, en toe geleidelik oorgeskakel met 'n noodskakelaar. My oordeel is SHIP IT. Ek sou die gedeelde transaksiegrens en daardie terugrolbare ontplooiing verskeep, met die hele afrekeningspad geïnstrumenteer. Het u 'n vraag hieroor? Sit dit in die kommentaar. En dit is die verskil vir vandag.

2:54 Ek is Niko van Axrisi. Samesmelt verantwoordelik.

Bronne

  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

Verwante video's