Վերադառնալ
Shopify-ը պահուստները Redis-ից տեղափոխեց MySQL և համակարգը դիմացավ ծանրաբեռնվածությանը
SiTech Team2 წთ. საკითხავი

Shopify-ը պահուստները Redis-ից տեղափոխեց MySQL և համակարգը դիմացավ ծանրաբեռնվածությանը

Shopify-ը գերվաճառքից պաշտպանող համակարգը Redis-ից տեղափոխեց MySQL՝ հիմնելով այն SKIP LOCKED-ի և յուրաքանչյուր միավորի համար մեկ տողի վրա։ Իսկական խոչընդոտը կապերն էին, ոչ թե պրոցեսորը։

Shopify-ը գերվաճառքը կանխող Redis-ի վրա հիմնված համակարգը փոխարինեց MySQL 8-ի SKIP LOCKED հատկության վրա կառուցված լուծումով և, ընկերության խոսքով, 2025 թվականի պիկ ծանրաբեռնվածության ընթացքում հասավ բարձր թողունակության իր նպատակներին։

Ինչու հին լուծումը սպառվեց

Գերվաճառքից պաշտպանությունը երկու գործողություն ունի՝ պահուստավորում, որը կարճաժամկետ արգելափակում է ստեղծում վճարման մեկնարկին, և հաստատում, որը վճարման հաջող ավարտից հետո միավորը մշտապես դուրս է գրում պահուստների գրանցամատյանից։ Նախկինում պահուստները պահվում էին Redis-ում՝ պահուստավորումը բանալու նվազեցում էր, ազատումը՝ ավելացում։ Redis-ը լավ էր դիմանում զուգահեռությանը, սակայն պահուստներն ու գրանցամատյանը ապրում էին տարբեր համակարգերում, ուստի հաստատման փուլը պահանջում էր թե՛ MySQL-ի թարմացում, թե՛ Redis-ի մաքրում, և այդ երկուսը հնարավոր չէր միավորել մեկ ատոմար քայլում։ Հերթականությունից կախված՝ դա կարող էր հանգեցնել գերվաճառքի կամ պակաս վաճառքի, իսկ մոդելը հաշվի չէր առնում բազմավայր պահուստները։

Մեկ տող մեկ միավորի համար՝ սահմանափակ պահոցում

Նոր լուծումը պահում է մեկ տող յուրաքանչյուր վաճառվող միավորի համար, այլ ոչ թե մեկ տող՝ քանակի սյունակով մեկ ապրանքի համար. տասը միավոր ունեցող ապրանքը տասը տող ունի, և պահուստները կարող են գրանցամատյանի հետ կիսել նույն ACID գործարքը։ Թիմը պահում էազատ տողերի սահմանափակ պահոց՝ առավելագույնը 1000 տող մեկ ապրանք-վայր զույգի համար, որը համալրվում է գրանցամատյանից հատուկ գործընթացով։ Եթե ֆլեշ-վաճառքը դատարկում է պահոցը, համալրումն աշխատում է արգելափակման հետևում, որպեսզի զուգահեռ պահուստավորումները սպասեն, այլ ոչ թե մրցեն տողեր ավելացնելու համար։

Կողպումների կարգավորում և իրական սահմանը

Մի քանի մանրամասնություն վճռորոշ եղավ։ Զտման սյուներով կազմված բաղադրյալ առաջնային բանալին տողերի կողպումը պահուստավորման հաշվով երկուսից հասցրեց մեկի։ Գործարքները READ COMMITTED մակարդակի տեղափոխելը վերացրեց համալրումը արգելափակող gap-կողպումները։ Կողպումների միասնական հերթականությունը վերացրեց փակուղիները պահուստավորման ու հաստատման միջև, իսկ UNION ALL-ով խմբավորումը կրճատեց դիմումների քանակը բազմատող զամբյուղների համար։

Սպասված խոչընդոտը չհայտնվեց։ Պրոցեսորը հեռու էր հագեցվածությունից, հարցումներն արդեն օպտիմիզացված էին, սակայն թիմը հանդիպեց առաստաղի. կապերը սպառում էին վճարման ուղու այլ հատվածները։ Յուրաքանչյուր SQL հարցումը բիզնես գործընթացով պիտակավորելը և ProxySQL շերտում կապերի զբաղվածության ժամանակի ագրեգացումը ցույց տվեցին, թե ով է ծախսում ամենաշատ ժամանակը։ Վճարման ուղու մաքրումը հանեց հիմնական հանգույցից ընթերցումների 50%-ը և գործարքների 33%-ը, իսկ InnoDB-ի հին պարամետրի վերանայումը վերացրեց ևս մեկ սահման։

Անցումը և արդյունքները

Redis-ը և MySQL-ը զուգահեռ աշխատում էին «ստվերային ռեժիմում», որտեղ ճշմարտության աղբյուրը դեռ Redis-ն էր. ապա Shopify-ը ճշմարտության աղբյուրը տեղափոխեց MySQL՝ պահպանելով արտակարգ անջատման հնարավորությունը և տեղադրումն իրականացնելով pod առ pod։ 2025 թվականի Black Friday-ին հարթակի վաճառականները պիկին հասան րոպեում 5,1 միլիոն դոլար վաճառքի ռեկորդի։

SSiTech

SiTech — AI-ով հզորացված վեբ մշակում

Ստեղծում ենք արագ ու ժամանակակից կայքեր և AI-ը ներդնում իրական բիզնես գործընթացներում։ Ունե՞ք նախագիծ կամ հարց։ Ուրախ կլինենք օգնել։