Shopify-ը տեղափոխեց գույքագրման ամրագրումները MySQL
Shopify-ը տեղափոխեց իր գույքագրման ամրագրման համակարգը Redis-ից MySQL տվյալների բազա, որն արդեն պարունակում էր գույքագրման մատյանը: Անհատապես արգելափակվող միավորների տողերի սահմանափակված լողավազանը թույլ է տալիս միաժամանակյա վճարումներին օգտագործել SKIP LOCKED՝ տարբեր համապատասխան միավորներ ընտրելու համար: Դիզայնը կախված է նաև գործարքների սահմաններից, հիմնական բանալու դասավորությունից, համալրման կանոններից և վճարման ընթացքում կապի պահման ժամանակի դիտարկումից:
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։ Ինչպե՞ս անվտանգ բաց թողնել կողպեքները։ Սա 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 համալրումը, և համահունչ աղյուսակի կարգ՝ շրջանաձև սպասումները կանխելու համար։ Հրապարակված օրինակը գրանցում է ժամկետանցության ժամանակը։ Լքված վճարումները պաշարի ազատում են պահանջում ի վերջո, հակառակ դեպքում գնումների զամբյուղը դառնում է տանտեր։ Shopify-ի գրառումը թողնում է այդ մաքրման ալգորիթմը չսահմանված, ուստի այս դիագրամը ցույց է տալիս կյանքի ցիկլի պահանջը։ Ահա որսը։
Ի՞նչ է բաց թողնում SKIP LOCKED-ը:
2:14 Skip locked-ը բացառում է կողպված տողերը, ուստի ձեռնարկը դրա արդյունքը անհամապատասխան է անվանում տեսք։ Այն չի տրամադրում ո՛չ ամբողջական պաշարի հաշվարկ, ո՛չ էլ արդար հերթագայություն։ Պահպանեք հասանելիության որոշումը և համալրման կանոնները դրա շուրջ։
Որտե՞ղ էր իրական առաստաղը:
2:26 Իսկ այդ առաստաղը։ Այլ վճարման կոդը չափազանց երկար էր պահում տվյալների բազայի կապերը։ Shopify-ը պիտակավորեց զանգահարողներին և չափեց կապի պահման ժամանակը, այնուհետև մաքրեց վճարման ուղին և վերանայեց թելերի միաժամանակյա աշխատանքը։ Արագ հարցումները դեռ կարող են հերթ կանգնել հարցումից դուրս։
Ինչու՞ ես կուղարկեի այս դիզայնը:
2:38 Նրանք ստվերային գրառումներ կատարեցին երկու համակարգերում՝ Redis-ի հեղինակությամբ, համեմատեցին արդյունքները, այնուհետև աստիճանաբար անցում կատարեցին սպանման անջատիչով։ Իմ վճիռն է 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



