+− THE DAILY DIFFdev & AI news
SHIP IT

Shopify zhvendosi rezervimet e inventarit në MySQL

Shopify zhvendosi sistemin e saj të rezervimit të inventarit nga Redis në bazën e të dhënave MySQL që tashmë mbante librin e inventarit.

Shopify zhvendosi sistemin e saj të rezervimit të inventarit nga Redis në bazën e të dhënave MySQL që tashmë mbante librin e inventarit. Një grup i kufizuar rreshtash njësish të kyçura individualisht lejon arkëtimet konkurruese të përdorin SKIP LOCKED për të zgjedhur njësi të ndryshme të përshtatshme. Dizajni varet gjithashtu nga kufijtë e transaksionit, paraqitja e çelësit primar, rregullat e rimbushjes dhe vëzhgimi i kohës së mbajtjes së lidhjes gjatë arkëtimit.

Lexoni edicionin e shkruar (anglisht) ↗

Çfarë mbulon kjo video

  • Modeli i vjetër i numëruesit të sasisë në Redis trajtonte njëkohshmërinë, por pastrimi i rezervimeve dhe përditësimi i librit të MySQL nuk mund të ndanin një transaksion të vetëm atomik lokal.
  • Zëvendësimi përdor një rresht për njësi të disponueshme në një grup të kufizuar në 1,000 për kombinim artikulli/vendndodhje. Një grup bosh mund të shkaktojë rimbushje të drejtpërdrejtë me kërkesa konkurruese që presin pas një kyçi rimbushjeje.
  • Çelësi primar i përbërë është (shop_id, inventory_item_id, inventory_group_id, id). Shopify reduktoi koston shtesë të kyçjes në prototipin e tij dhe përdori READ COMMITTED për të shmangur kyçjet e boshllëkut që bllokuan rimbushjen.
  • Rezervimi fshin rreshtat e grupit përpara se të fusë regjistrimet e rezervimeve. Angazhimi lëshon kyçjet e bazës së të dhënave ndërsa mbajtja e ruajtur vazhdon gjatë pagesës; pagesa e suksesshme kërkon librin dhe heq rezervimin në një transaksion atomik të mëvonshëm.
  • MySQL dokumenton SKIP LOCKED si një pamje të papërputhshme që lë jashtë rreshtat e kyçur. Ai nuk vendos një numër të plotë stoku ose ndarje të drejtë të radhës, zbatohet vetëm për kyçjet në nivel rreshti dhe është i pasigurt për replikimin e bazuar në deklaratë.
  • Shembulli i burimit përfshin expires_at, por Shopify nuk dokumenton algoritmin e pastrimit të skadimit të MySQL. Dega e lëshimit/skadimit të videos është një kërkesë shpjeguese e ciklit jetësor.
  • Koha e mbajtjes së lidhjes në kodin tjetër të arkëtimit ishte pengesa e fundit e përshkueshmërisë. Shopify shkroi në hije të dy sistemet, krahasoi rezultatet dhe kaloi gradualisht me një kthim mbrapa të çelësit të vrasjes Redis.

Transkript i përkthyer

Përkthyer nga tregimi origjinal në anglisht. Audio dhe titrat e disponueshme kontrollohen nga YouTube.

Pse të zhvendosen rezervimet në MySQL?

0:00 Një arkëtim ka nevojë që Redis të mbetet i shpejtë. Shopify zhvendosi rezervimet e inventarit në MySQL duke përdorur një rresht për njësi në një grup të kufizuar. Pse të zgjidhni MySQL? Si t'i anashkaloni kyçjet në mënyrë të sigurt? Ky është The Daily Diff, nën kapak. Dhe pse kërkesat e shpejta ende arrinin një tavan? Shopify është një platformë tregtare për shitje online dhe personalisht. Redis është një ruajtje të dhënash në memorie.

0:21 MySQL është një bazë të dhënash relacionale, dhe Shopify tashmë mbante librin e inventarit atje. Një rezervim mban shkurtimisht stokun ndërsa blerësi paguan.

Pse dy dyqane ishin të rrezikshme?

0:29 Modeli i tyre Redis zvogëlonte një numërues artikujsh. Pretendimi i një porosie të paguar nënkuptonte përditësimin e librit të MySQL dhe pastrimin e Redis. Këto shkrime të ndara mund të linin stokun të shitur dy herë ose të padisponueshëm kur duhej të ishte i shitshëm. Modeli i vjetër gjithashtu nuk kishte ndërgjegjësim për vendndodhjen. Zëvendësimi duhet të zgjedhë stok nga diku që mund të përmbushë porosinë. Një depo në kontinentin e gabuar bën një hyrje të shkëlqyer në bazën e të dhënave dhe një premtim të tmerrshëm dërgese. Tentativat e mëparshme të MySQL përdorën një rresht sasi, kështu që arkëtimet konkurruese u radhitën në të njëjtin kyç.

Cila bëhet njësia e kyçur?

0:56 Mendoni për një litar kadifeje rreth një qelize të fletëllogarisë. Shtimi i më shumë punëtorëve vetëm zgjat radhën. Shopify ndryshoi objektin e kyçur. Çdo njësi e disponueshme merr rreshtin e vet. Një lexim me kyçje anashkalon njësitë që një transaksion tjetër mban dhe zgjedh njësi të tjera të përshtatshme. Punëtorët e ndryshëm mund të fitojnë rreshta të ndryshëm, ndërsa numëruesi i nxehtë mbetet jashtë rrugës së tyre.

Çfarë ndodh kur grupi boshatiset?

1:15 Ky grup është i kufizuar në një mijë rreshta për artikull dhe vendndodhje. Rimbushja tërheq nga libri. Nëse boshatiset, rezervimi rinovon rrugën në mënyrë të drejtpërdrejtë, me kërkesa konkurruese që presin pas një kyçi rimbushjeje. Grupi bosh nuk do të thotë magazinë bosh. Rezervimi fshin rreshtat e zgjedhur të grupit, pastaj fut regjistrimet e rezervimeve në një transaksion. Angazhimi lëshon kyçjet e bazës së të dhënave.

1:35 Kthimi mbrapa anulon ndryshimet. Rezervimi mbijeton përpunimin e pagesës si gjendje e ruajtur. Pagesa e suksesshme kërkon librin dhe heq rezervimin në mënyrë atomike. Kyçjet e bazës së të dhënave nuk kanë nevojë kurrë të kujdesen për formularin e pagesës. Çelësi i tyre primar i përbërë fillon me dyqan, artikull, grup, pastaj identitetin e njësisë. Përputhja e kërkimit reduktoi kyçjen e indeksit në prototipin e tyre. Ata gjithashtu përdorin lexim të angazhuar për të shmangur kyçjet e boshllëkut që bllokuan rimbushjen e grupit,

1:57 dhe një renditje të qëndrueshme të tabelave për të parandaluar pritjet rrethore. Shembulli i publikuar regjistron një kohë skadimi. Pagesat e braktisura kanë nevojë që stoku të lëshohet përfundimisht, ose karroca e blerjeve bëhet një pronar. Postimi i Shopify e lë të paspecifikuar atë algoritëm pastrimi, kështu që kjo diagramë tregon kërkesën e ciklit jetësor. Këtu është kapja.

Çfarë lë jashtë SKIP LOCKED?

2:14 Skip locked përjashton rreshtat e kyçur, kështu që manuali e quan rezultatin e tij një pamje të papërputhshme. Ai nuk ofron as një numër të plotë stoku, as ndarje të drejtë të radhës. Mbani vendimin e disponueshmërisë dhe rregullat e rimbushjes rreth tij.

Ku ishte tavani i vërtetë?

2:26 Dhe ai tavani? Kodi tjetër i arkëtimit po mbante lidhjet e bazës së të dhënave shumë gjatë. Shopify etiketoi thirrësit dhe matën kohën e mbajtjes së lidhjes, pastaj pastruan rrugën e arkëtimit dhe rishikuan njëkohshmërinë e fijeve. Kërkesat e shpejta ende mund të radhiten jashtë kërkesës.

Pse do ta dërgoja këtë dizajn?

2:38 Ata shkruan në hije të dy sistemet me Redis autoritativ, krahasuan rezultatet, pastaj kaluan gradualisht me një çelës vrasjeje. Vendimi im është SHIP IT. Do të dërgoja kufirin e transaksionit të përbashkët dhe atë shpërndarje të kthyeshme, me të gjithë rrugën e arkëtimit të instrumentuar. Keni ndonjë pyetje rreth kësaj? Vendoseni në komente. Dhe ky është ndryshimi për sot.

2:54 Unë jam Niko nga Axrisi. Bashkohuni me përgjegjësi.

Burimet

  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

Video të ngjashme