Shopify የዕቃ ማከማቻ ቦታዎችን ወደ MySQL አዛወረ
Shopify የዕቃ ማከማቻ ሥርዓቱን ከ Redis ወደ MySQL ዳታቤዝ አዛውሯል፣ ይህም የዕቃ ማከማቻ ደብተር አስቀድሞ ይዟል። በተናጥል ሊቆለፉ የሚችሉ የተገደበ የዩኒት ረድፎች ስብስብ ተጓዳኝ ክፍያዎች የተለያዩ ብቁ ዩኒቶችን ለመምረጥ SKIP LOCKED እንዲጠቀሙ ያስችላቸዋል። ዲዛይኑ የግብይት ወሰኖች፣ ዋና ቁልፍ አቀማመጥ፣ የመሙያ ደንቦች እና በክፍያ ጊዜ የግንኙነት መያዣ ጊዜን መከታተል ላይ የተመሰረተ ነው።
Shopify የዕቃ ማከማቻ ሥርዓቱን ከ Redis ወደ MySQL ዳታቤዝ አዛውሯል፣ ይህም የዕቃ ማከማቻ ደብተር አስቀድሞ ይዟል። በተናጥል ሊቆለፉ የሚችሉ የተገደበ የዩኒት ረድፎች ስብስብ ተጓዳኝ ክፍያዎች የተለያዩ ብቁ ዩኒቶችን ለመምረጥ SKIP LOCKED እንዲጠቀሙ ያስችላቸዋል። ዲዛይኑ የግብይት ወሰኖች፣ ዋና ቁልፍ አቀማመጥ፣ የመሙያ ደንቦች እና በክፍያ ጊዜ የግንኙነት መያዣ ጊዜን መከታተል ላይ የተመሰረተ ነው።
ይህ ቪዲዮ ምን ይሸፍናል
- የድሮው የ Redis መጠን ቆጣሪ ሞዴል ተጓዳኝነትን ይቆጣጠር ነበር፣ ነገር ግን የመጠባበቂያ ማጽዳት እና የ MySQL ደብተር ማሻሻያ አንድ ነጠላ የአካባቢ አቶሚክ ግብይት መጋራት አልቻሉም።
- ተተኪው በእያንዳንዱ ዕቃ/አካባቢ ጥምረት እስከ 1,000 በሚደርስ ገደብ ውስጥ በእያንዳንዱ የሚገኝ ዩኒት አንድ ረድፍ ይጠቀማል። ባዶ ገንዳ የመሙላት መቆለፊያ ኋላ በሚጠብቁ ተጓዳኝ ጥያቄዎች የመስመር ላይ መሙላትን ሊያስነሳ ይችላል።
- የተዋሃደው ዋና ቁልፍ (shop_id, inventory_item_id, inventory_group_id, id) ነው። Shopify በፕሮቶታይፑ ውስጥ የመቆለፊያ ወጪን ቀንሷል እና የመሙላትን የከለከሉትን የባዶነት መቆለፊያዎች ለማስቀረት READ COMMITTEDን ተጠቅሟል።
- ማስያዣዎች የመጠባበቂያ መዝገቦችን ከማስገባትዎ በፊት የገንዳ ረድፎችን ይሰርዛሉ። መፈጸም የመረጃ ቋት መቆለፊያዎችን ይለቃል፣ የተከማቸው ይዞታ ክፍያ ላይ ይቆያል፤ የተሳካ ክፍያ ደብተሩን ይጠይቃል እና ማስያዣውን በኋላ በአቶሚክ ግብይት ያስወግዳል።
- MySQL SKIP LOCKEDን እንደ የማይጣጣም እይታ ይገልጸዋል፣ ይህም የተቆለፉ ረድፎችን ይተዋል ማለት ነው። የተሟላ የዕቃ ቆጠራ ወይም ፍትሃዊ ተራ መውሰድን አያቋቁምም፣ ለረድፍ ደረጃ መቆለፊያዎች ብቻ ነው የሚሰራው እና ለመግለጫ ላይ የተመሰረተ ማባዛት ደህንነቱ የተጠበቀ አይደለም።
- የመጀመሪያው ምሳሌ expires_atን ያካትታል፣ ነገር ግን Shopify የ MySQL ጊዜ ማብቂያ-ማጽዳት አልጎሪዝምን አያብራራም። የቪዲዮው ልቀትን/ጊዜ ማብቂያ ቅርንጫፍ የማብራሪያ የሕይወት ዑደት መስፈርት ነው።
- በሌላ የክፍያ ኮድ ውስጥ የግንኙነት መያዣ ጊዜ የመጨረሻው የፍሰት መጨናነቅ ነበር። Shopify ሁለቱንም ስርዓቶች በጥላ ጽፎ፣ ውጤቶችን አወዳድሮ እና በ Redis kill-switch ምትኬ ቀስ በቀስ ቀይሯል።
የተተረጎመ ግልባጭ
ከዋናው የእንግሊዝኛ ትረካ የተተረጎመ። የሚገኙ ኦዲዮ እና መግለጫ ጽሑፎች በYouTube ቁጥጥር ስር ናቸው።
ለምን ማስያዣዎችን ወደ MySQL ማዛወር አስፈለገ?
0:00 የሂሳብ ማረጋገጫ በፍጥነት ለመስራት Redis ያስፈልገዋል። Shopify የዕቃ ማስያዣዎችን ወደ MySQL አዛወረ፣ ለእያንዳንዱ ክፍል አንድ ረድፍ በ የተገደበ ገንዳ ውስጥ በመጠቀም። MySQLን የመረጠው ለምንድን ነው? መቆለፊያዎችን በአስተማማኝ ሁኔታ እንዴት መዝለል ይቻላል? ይህ The Daily Diff ነው፣ ከጀርባው። እና ፈጣን መጠይቆች አሁንም ገደብ የነካው ለምንድን ነው? Shopify በመስመር ላይ እና በአካል ለመሸጥ የንግድ መድረክ ነው። Redis በማስታወሻ ውስጥ ያለ የውሂብ ማከማቻ ነው።
0:21 MySQL የሪላሽናል ዳታቤዝ ሲሆን Shopify የዕቃውን ደብተር አስቀድሞ እዚያ ያቆይ ነበር። ማስያዣ ገዢ ሲከፍል ዕቃን ለአጭር ጊዜ ይይዛል።
ሁለት ማከማቻዎች አደገኛ የነበሩት ለምንድን ነው?
0:29 የእነሱ የ Redis ሞዴል የዕቃ ቆጣሪን ይቀንስ ነበር። የተከፈለ ትዕዛዝ መጠየቅ ማለት የ MySQL ደብተርን ማዘመን እና Redisን ማጽዳት ማለት ነበር። እነዚያ የተለያየ ጽሑፎች ዕቃ ሁለት ጊዜ የተሸጠ ወይም መሸጥ ሲገባው የማይገኝ እንዲሆን ሊያደርጉ ይችላሉ። የድሮው ሞዴል የቦታ ግንዛቤም አልነበረውም። ተተኪው ትዕዛዙን ከሚያሟላ ቦታ ዕቃ መምረጥ አለበት። በተሳሳተ አህጉር ላይ ያለ መጋዘን በጣም ጥሩ የዳታቤዝ ግቤት እና አስከፊ የማድረስ ቃል ኪዳን ነው። ቀደም ሲል የ MySQL ሙከራዎች የብዛት ረድፍ ይጠቀሙ ነበር፣ ስለዚህ ተወዳዳሪ ክፍያዎች በተመሳሳይ
ሊቆለፍ የሚችለው ክፍል ምን ይሆናል?
0:56 መቆለፊያ ላይ ይሰለፉ ነበር። አንድ ቬልቬት ገመድ በአንድ የሰንጠረዥ ሕዋስ ዙሪያ እንዳለ አስቡ። የበለጠ ሰራተኞችን መጨመር ወረፋውን ብቻ ያረዝማል። Shopify ሊቆለፍ የሚችለውን ነገር ለውጧል። እያንዳንዱ የሚገኝ ክፍል የራሱን ረድፍ ያገኛል። የመቆለፍ ንባብ ሌሎች ግብይቶች የያዙትን ክፍሎች ይዘላል እና ሌሎች ብቁ ክፍሎችን ይመርጣል። የተለያዩ ሰራተኞች የተለያዩ ረድፎችን ማግኘት ይችላሉ፣ ሞቃት ቆጣሪው ከመንገዳቸው ይወጣል።
ገንዳው ሲባዶ ምን ይሆናል?
1:15 ያ ገንዳ በእያንዳንዱ ዕቃ እና ቦታ አንድ ሺህ ረድፎች ላይ የተገደበ ነው። መሙላት ከደብተሩ ይሳባል። ባዶ ከሆነ፣ የመጠባበቂያ መንገድ በመስመር ላይ ይሞላል፣ ተወዳዳሪ ጥያቄዎች ከመሙላት መቆለፊያ ጀርባ ይጠብቃሉ። ባዶ ገንዳ ማለት ባዶ መጋዘን ማለት አይደለም። ማስያዣ የተመረጡ የገንዳ ረድፎችን ይሰርዛል፣ ከዚያም በመጠባበቂያ መዝገቦችን በ ግብይት ውስጥ ያስገባል። መፈጸም የመረጃ ቋት መቆለፊያዎችን ይለቃል።
1:35 መልሶ መገልበጥ ለውጦችን ይቀለብሳል። ማስያዣው ክፍያ በሚካሄድበት ጊዜ እንደ ተከማቸ ሁኔታ ይኖራል። የተሳካ ክፍያ ደብተሩን ይጠይቃል እና ማስያዣውን በአቶሚክ ሁኔታ ያስወግዳል። የዳታቤዝ መቆለፊያዎች የክፍያ ቅጹን መንከባከብ አያስፈልጋቸውም። የእነሱ የተዋሃደ ዋና ቁልፍ በሱቅ፣ ዕቃ፣ ቡድን፣ ከዚያም ክፍል ማንነት ይጀምራል። ፍለጋውን ማዛመድ በፕሮቶታይፓቸው ውስጥ የመረጃ ጠቋሚ መቆለፍን ቀንሷል። እንዲሁም የገንዳ መሙላትን የከለከሉትን የባዶነት መቆለፊያዎችን ለማስቀረት Read Committedን ይጠቀማሉ፣ እና ክብ ቅርጽ ያላቸውን መጠበቆች ለመከላከል ወጥነት ያለው የሰንጠረዥ ቅደም ተከተል።
1:57 እንዲሁም የገንዳ መሙላትን የከለከሉትን የባዶነት መቆለፊያዎችን ለማስቀረት Read Committedን ይጠቀማሉ፣ እና ክብ ቅርጽ ያላቸውን መጠበቆች ለመከላከል ወጥነት ያለው የሰንጠረዥ ቅደም ተከተል ይጠቀማሉ። የታተመው ምሳሌ ጊዜ ማብቂያ ጊዜን ይመዘግባል። የተተዉ ክፍያዎች ዕቃው እንዲለቀቅ ያስፈልጋል፣ አለበለዚያ የገበያ ጋሪው ባለንብረት ይሆናል። የShopify ጽሑፍ ያንን የጽዳት አልጎሪዝም አልገለጸም፣ ስለዚህ ይህ ሥዕላዊ መግለጫ የሕይወት ዑደት መስፈርትን ያሳያል። ይህ ነው ዋናው ነገር።
SKIP LOCKED ምን ይተዋል?
2:14 Skip locked የተቆለፉ ረድፎችን አያካትትም፣ ስለዚህ መመሪያው ውጤቱን የማይጣጣም እይታ ይለዋል። የተሟላ የዕቃ ቆጠራም ሆነ ፍትሃዊ ተራ መውሰድን አይሰጥም። የመገኘት ውሳኔን እና የመሙላት ደንቦችን ከሱ ጋር ያቆዩ።
እውነተኛው ገደብ የት ነበር?
2:26 እና ያ ገደብ? ሌላ የሂሳብ ማረጋገጫ ኮድ የመረጃ ቋት ግንኙነቶችን ለረጅም ጊዜ ይይዝ ነበር። Shopify ደዋዮችን ለይቶ የግንኙነት መያዣ ጊዜን ለካ፣ ከዚያም የሂሳብ ማረጋገጫ መንገዱን አጸዳ እና የክር ተጓዳኝነትን እንደገና ገመገመ። ፈጣን መጠይቆች አሁንም ከመጠይቁ ውጪ ሊሰለፉ ይችላሉ።
ይህን ንድፍ ለምን ልልክ እችላለሁ?
2:38 ሁለቱንም ስርዓቶች ከ Redis ስልጣን ጋር በጥላ ጽፈዋል፣ ውጤቶችን አወዳድረው፣ ከዚያም በ kill switch ቀስ በቀስ ቀይረዋል። የኔ ብያኔ SHIP IT ነው። የተጋራውን የግብይት ወሰን እና ያንን የሚቀለበስ ስርጭት እልክ ነበር፣ ሙሉው የሂሳብ ማረጋገጫ መንገድ በመሳሪያ የታጀበ። ስለዚህ ጉዳይ ጥያቄ አለዎት? በአስተያየቶች ውስጥ ያስቀምጡት። እና ለዛሬ ያለው ልዩነት ይህ ነው።
2:54 እኔ ከ Axrisi ኒኮ ነኝ። በኃላፊነት ያዋህዱ።
ምንጮች
- 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



