+− THE DAILY DIFFdev & AI news
SHIP IT

Shopify инвентардык резервацияларды MySQLга жылдырды

Shopify өзүнүн инвентардык резервация системасын Redisтен инвентардык китепти кармап турган MySQL маалымат базасына жылдырды.

Shopify өзүнүн инвентардык резервация системасын Redisтен инвентардык китепти кармап турган MySQL маалымат базасына жылдырды. Жекече кулпулануучу бирдик саптардын чектелген бассейни бир убактагы төлөмдөрдү ар кандай жарамдуу бирдиктерди тандоо үчүн SKIP LOCKED колдонууга мүмкүндүк берет. Дизайн ошондой эле транзакция чек араларына, негизги ачкычтын жайгашуусуна, толуктоо эрежелерине жана төлөм учурунда туташуу кармоо убактысын байкоого таянат.

Жазма басылышын окуу (Англисче) ↗

Бул видео эмнелерди камтыйт

  • Эски Redis санды-каршы модел бир убакта иштөөнү чечти, бирок резервацияны тазалоо жана MySQL китебин жаңыртуу бир жергиликтүү атомардык транзакцияны бөлүшө алган жок.
  • Алмаштыруу ар бир буюм/жайгашкан жердин айкалышы үчүн 1000ге чейин чектелген пулда ар бир жеткиликтүү бирдик үчүн бир сапты колдонот. Бош пул толуктоо кулпусунун артында күтүп жаткан бир убактагы сурамдар менен катардагы толуктоону ишке киргизиши мүмкүн.
  • Курама негизги ачкыч (shop_id, inventory_item_id, inventory_group_id, id) болуп саналат. Shopify өзүнүн прототипинде кулпунун чыгымдарын азайтты жана толуктоону бөгөттөгөн боштук кулпуларын болтурбоо үчүн READ COMMITTED колдонду.
  • Резерв резервация жазууларын киргизүүдөн мурун бассейндин саптарын жок кылат. Каттоо маалымат базасынын кулпуларын бошотот, ал эми сакталган кармоо төлөм аркылуу сакталат; ийгиликтүү төлөм китепти талап кылат жана кийинки атомардык транзакцияда резервацияны жок кылат.
  • MySQL SKIP LOCKED кулпуланган саптарды камтыбаган ыраатсыз көрүнүш катары документтештирет. Ал толук запас санын же адилеттүү кезектешүүнү орнотпойт, сап деңгээлиндеги кулпуларга гана колдонулат жана билдирүүгө негизделген репликация үчүн кооптуу.
  • Булак үлгүсү expires_at камтыйт, бирок Shopify MySQL мөөнөтү бүткөн тазалоо алгоритмин документтештирген эмес. Видеодогу чыгаруу/мөөнөтү бүткөн бутак түшүндүрүүчү жашоо циклинин талабы болуп саналат.
  • Башка төлөм кодунда туташууну кармоо убактысы акыркы өткөрүү жөндөмдүүлүгүнүн тоскоолдугу болду. Shopify эки системаны тең көмүскө жазды, натыйжаларды салыштырды жана Redis өчүрүү которгуч менен акырындык менен алмаштырды.

Котормо стенограмма

Англис тилиндеги баштапкы баяндамадан которулган. Жеткиликтүү аудио жана коштомо жазуулар YouTube тарабынан көзөмөлдөнөт.

Резервацияларды эмне үчүн MySQLга жылдыруу керек?

0:00 Төлөм тез болуу үчүн Redis керек. Shopify инвентардык резервацияларды MySQLга бирдикке бир сапты колдонуп жылдырды чектелген бассейнде. Эмне үчүн MySQL тандоо керек? Кулпуларды кантип коопсуз өткөрүп жиберсе болот? Бул Daily Diff, ичинде. Жана эмне үчүн тез сурамдар дагы эле шыпка тийди? Shopify - бул онлайн жана жеке сатуу үчүн соода платформасы. Redis - бул эс тутумдагы маалымат сактагыч.

0:21 MySQL - бул реляциялык маалымат базасы, жана Shopify инвентардык китебин мурунтан эле сактап келген ал жерде. Резервация сатып алуучу төлөп жатканда запасты кыска убакытка кармайт.

Эмне үчүн эки дүкөн кооптуу болгон?

0:29 Алардын Redis модели буюмдун эсебин азайтты. Төлөнгөн буйрутманы талап кылуу MySQL китебин жаңыртууну жана Redisти тазалоону билдирген. Ал өзүнчө жазуулар запасты эки жолу сатылган же жеткиликтүү болбогон абалда калтырышы мүмкүн сатыла турган болгондо. Эски моделде жайгашкан жерди билүү да жок болчу. Алмаштыруу буйрутманы аткара ала турган жерден запас тандоосу керек. Туура эмес континенттеги кампа мыкты маалымат базасынын жазуусун жана ужас жеткирүү убадасын берет. Мурунку MySQL аракеттери саны бар сапты колдонгон, ошондуктан атаандашкан төлөмдөр

Кулпулануучу бирдик эмне болот?

0:56 бир эле кулпуда кезекке турушкан. Эсептөө жадыбалынын уячасынын айланасындагы баркыт арканды ойлонгула. Көбүрөөк жумушчуларды кошуу жөн гана кезекти узартат. Shopify кулпулана турган объектини өзгөрттү. Ар бир жеткиликтүү бирдик өзүнүн сабын алат. Кулпулоо окуусу башка транзакция кармап турган бирдиктерди өткөрүп жиберет жана башка жарамдуу бирдиктерди тандайт. Ар кандай жумушчулар ар кандай саптарды ала алышат, ал эми ысык эсептегич алардын жолунан алыс болот.

Бассейн бошогондо эмне болот?

1:15 Бул бассейн бир буюмга жана жайгашкан жерге миң сапка чектелген. Толуктоо китептен алынат. Эгер ал бошоп калса, резервдик жол толуктоо кулпусунун артында күтүп жаткан атаандашкан сурамдар менен катардагы толуктоону ишке ашырат. Толуктоо кулпусунун артында күтүп жаткан атаандашкан сурамдар менен катардагы толуктоону ишке ашырат. Бош бассейн бош кампаны билдирбейт. Резерв тандалган бассейндин саптарын жок кылат, андан кийин транзакцияда резервация жазууларын киргизет. Каттоо маалымат базасынын кулпуларын бошотот.

1:35 Кайтаруу өзгөртүүлөрдү жокко чыгарат. Резервация төлөмдү иштетүүдөн кийин сакталган абал катары сакталат. Ийгиликтүү төлөм китепти талап кылат жана резервацияны атомардык түрдө жок кылат. Маалымат базасынын кулпулары төлөм формасын багыш керек эмес. Алардын курама негизги ачкычы дүкөн, буюм, топ, андан кийин бирдиктин иденттүүлүгү менен башталат. Издөөнү дал келтирүү алардын прототипинде индексти кулпулоону азайткан. Алар ошондой эле бассейнди толуктоону бөгөттөгөн боштук кулпуларын болтурбоо үчүн окулганды тастыктоону колдонушат

1:57 жана тегерек күтүүлөрдү болтурбоо үчүн ырааттуу таблица тартибин колдонушат. Жарыяланган үлгү мөөнөтүнүн бүтүү убактысын жазат. Ташталган төлөмдөр запасты акыры бошотушу керек, же соода арабасы ижарачы болуп калат. Shopifyдин посту ал тазалоо алгоритмин тактабайт, ошондуктан бул диаграмма жашоо циклинин талабын көрсөтөт. Мына карма.

SKIP LOCKED эмнени калтырат?

2:14 Өткөрүп жиберилген кулпуланган саптарды кошпогондуктан, колдонмо анын натыйжасын ыраатсыз көрүнүш деп атайт. Ал толук запас санын да, адилеттүү кезектешүүнү да камсыз кылбайт. Жеткиликтүүлүк чечимин жана толуктоо эрежелерин анын айланасында кармагыла.

Чыныгы шып кайда эле?

2:26 Жана ал шып? Башка төлөм коду маалымат базасынын туташууларын өтө узак кармап турган. Shopify чалуучуларды белгилеп, туташуу кармоо убактысын өлчөдү, андан кийин төлөм жолун тазалап, жиптердин бир убакта иштешин кайра карап чыкты. Тез сурамдар дагы эле сурамдын сыртында кезекке тура алышат.

Эмне үчүн мен бул дизайнды жөнөтмөк элем?

2:38 Алар Redis авторитеттүү болгон эки системаны тең көмүскө жазды, натыйжаларды салыштырды, андан кийин өчүрүү которгуч менен акырындык менен алмаштырды. Менин чечимим - жөнөтүү. Мен жалпы транзакция чек арасын жана ал кайтарууга боло турган жайылтууну жөнөтмөкмүн, бүт төлөм жолу куралданган болсо. Бул боюнча сурооңор барбы? Комментарийлерге жазгыла. Жана бүгүнкү айырма ушул.

2:54 Мен Axrisiден Нико. Жоопкерчиликтүү бириктиргиле.

Булактар

  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

Окшош видеолор

under-the-hood · ky · 2026-ж., 11-окт.

Жооп жоголгондо Stripe сиздин суроо-талабыңызды эстеп калат

Тайм-аут сервер операцияны аяктагандан кийин да төлөмдү белгисиз калтырышы мүмкүн. Бул «Under the Hood» түшүндүрмөсү Stripe API v1дин документтештирилген идемпотенттүүлүк келишимин колдонуп, туруктуу

2:54 ↗