+− THE DAILY DIFFdev & AI news
SHIP IT

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-ից։ Միավորել պատասխանատվությամբ։

Աղբյուրներ

  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 · hy · 11 հոկ, 2026 թ.

Stripe-ը հիշում է Ձեր հարցումը, երբ պատասխանն անհետանում է

Ժամանակի սահմանաչափը կարող է անորոշ թողնել վճարումը, երբ սերվերը ավարտել է գործողությունը։ «Under the Hood» բացատրությունը օգտագործում է Stripe API v1-ի փաստաթղթավորված իդեմպոտենտության պայմանագիրը՝ ց

2:54 ↗
under-the-hood · hy · 24 սեպ, 2026 թ.

SAML-ը՝ ներքին կառուցվածքը. ստորագրությունը նամակի ներսում

SAML-ը մուտք է գործում ձեր գրեթե յուրաքանչյուր աշխատանքային հավելված, և դրա ստորագրությունն ապրում է այն XML-ի ներսում, որը ստորագրում է: Ներքին կառուցվածքը. մուտքի պարը հավելվածի, բրաուզերի և ինքնութ

3:02 ↗