Shopify қойма резервацияларын MySQL-ға көшірді
Shopify өзінің қойманы резервациялау жүйесін Redis-тен MySQL дерекқорына көшірді, ол жерде қойма тізілімі бұрыннан сақталған болатын.
Shopify өзінің қойманы резервациялау жүйесін Redis-тен MySQL дерекқорына көшірді, ол жерде қойма тізілімі бұрыннан сақталған болатын. Жеке-жеке құлыптауға болатын бірлік қатарларының шектеулі қоры бір мезгілдегі төлемдерге басқа сәйкес бірліктерді таңдау үшін SKIP LOCKED қолдануға мүмкіндік береді. Дизайн сонымен қатар транзакция шекараларына, бастапқы кілт орналасуына, толықтыру ережелеріне және төлем кезіндегі қосылымды ұстау уақытын бақылауға байланысты.
Жазбаша басылымды оқыңыз (ағылшынша) ↗
Бұл бейне не туралы
- Ескі Redis сандық есептегіш моделі бір мезгілде жұмыс істеуді қамтамасыз етті, бірақ резервацияны тазалау және MySQL тізілімін жаңарту бір жергілікті атомдық транзакцияны бөлісе алмады.
- Ауыстыру әрбір тауар/орналасу комбинациясы үшін 1000-ға дейін шектелген пулдегі әрбір қол жетімді бірлікке бір қатарды пайдаланады. Бос пул толықтыру құлпының артында күтіп тұрған бір мезгілдегі сұраныстармен қатар толықтыруды іске қосуы мүмкін.
- Құрама бастапқы кілт (shop_id, inventory_item_id, inventory_group_id, id) болып табылады. Shopify өзінің прототипінде құлыптау шығындарын азайтты және толықтыруды блоктаған gap locks болдырмау үшін 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 Кері қайтару өзгерістерді болдырмайды. Резервация төлемді өңдеуден кейін сақталған күй ретінде сақталады. Сәтті төлем тізілімді талап етеді және резервацияны атомдық түрде жояды. Дерекқор құлыптарына төлем формасын ешқашан бақылау қажет емес. Олардың құрама бастапқы кілті дүкен, тауар, топ, содан кейін бірлік идентификаторынан басталады. Іздеуді сәйкестендіру олардың прототипінде индексті құлыптауды азайтты. Олар сонымен қатар пулды толықтыруды блоктаған gap locks болдырмау үшін read committed
1:57 және айналмалы күтулерді болдырмау үшін келісілген кесте тәртібін қолданады. Жарияланған мысалда жарамдылық мерзімі жазылған. Тастап кеткен төлемдер үшін қорды ақыры босату қажет, әйтпесе сауда себеті үй иесіне айналады. 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



