+− THE DAILY DIFFdev & AI news
SHIP IT

Shopify એ ઇન્વેન્ટરી રિઝર્વેશન MySQL માં ખસેડ્યા

Shopify એ તેની ઇન્વેન્ટરી રિઝર્વેશન સિસ્ટમને Redis માંથી MySQL ડેટાબેઝમાં ખસેડી છે, જ્યાં ઇન્વેન્ટરી લેજર પહેલેથી જ હતું.

Shopify એ તેની ઇન્વેન્ટરી રિઝર્વેશન સિસ્ટમને Redis માંથી MySQL ડેટાબેઝમાં ખસેડી છે, જ્યાં ઇન્વેન્ટરી લેજર પહેલેથી જ હતું. વ્યક્તિગત રીતે લોક કરી શકાય તેવી યુનિટ પંક્તિઓનો બાઉન્ડ પૂલ એક સાથે ચેકઆઉટને જુદા જુદા યોગ્ય યુનિટ પસંદ કરવા માટે SKIP LOCKED નો ઉપયોગ કરવાની મંજૂરી આપે છે. આ ડિઝાઇન ટ્રાન્ઝેક્શનની મર્યાદાઓ, પ્રાઇમરી-કી લેઆઉટ, રિપ્લેનિશમેન્ટ નિયમો અને ચેકઆઉટ દરમિયાન કનેક્શન હોલ્ડ ટાઇમના નિરીક્ષણ પર પણ આધાર રાખે છે.

લખેલી આવૃત્તિ વાંચો (અંગ્રેજી) ↗

આ વીડિયોમાં શું આવરી લેવામાં આવ્યું છે

  • જૂનું Redis ક્વોન્ટિટી-કાઉન્ટર મોડેલ કન્કરન્સીને હેન્ડલ કરતું હતું, પરંતુ રિઝર્વેશન ક્લિનઅપ અને MySQL લેજર અપડેટ એક જ લોકલ એટોમિક ટ્રાન્ઝેક્શન શેર કરી શકતા ન હતા.
  • રિપ્લેસમેન્ટ પ્રતિ આઇટમ/લોકેશન કોમ્બિનેશન દીઠ 1,000 યુનિટની મર્યાદાવાળા પૂલમાં દરેક ઉપલબ્ધ યુનિટ માટે એક પંક્તિનો ઉપયોગ કરે છે. ખાલી પૂલ કન્કરન્ટ રિક્વેસ્ટ સાથે ઇનલાઇન રિપ્લેનિશમેન્ટને ટ્રિગર કરી શકે છે જે રિપ્લેનિશમેન્ટ લોકની પાછળ રાહ જુએ છે.
  • કોમ્પોઝિટ પ્રાઇમરી કી (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 શા માટે પસંદ કરવું? તમે લોકને સુરક્ષિત રીતે કેવી રીતે છોડી શકો છો? આ ધ ડેઇલી ડિફ છે, હૂડ હેઠળ. અને ઝડપી ક્વેરીઝ હજી પણ સીલિંગ સુધી કેમ પહોંચતી હતી? 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 ને અધિકૃત રાખીને બંને સિસ્ટમ પર શેડો-રાઇટ કર્યું, પરિણામોની તુલના કરી, પછી કિલ સ્વીચ સાથે ધીમે ધીમે સ્વિચ કર્યું. મારો નિર્ણય 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 · gu · 11 ઑક્ટો, 2026

જ્યારે પ્રતિભાવ અદૃશ્ય થઈ જાય ત્યારે Stripe તમારી વિનંતી યાદ રાખે છે

સર્વર ઑપરેશન પૂર્ણ કરી લે તે પછી ટાઈમઆઉટ ચેકઆઉટને અનિશ્ચિત છોડી શકે છે. આ અંડર ધ હૂડ સમજાવનાર Stripe API v1ના દસ્તાવેજીકૃત આઇડેમ્પોટેન્સી કરારનો ઉપયોગ કરીને સ્થિર ઑપરેશન કી, સાચવેલ પ્રતિભાવ રિપ્લે, પે

2:54 ↗
under-the-hood · gu · 24 સપ્ટે, 2026

SAML, અંદરથી: પત્રની અંદરની સહી

SAML તમને લગભગ દરેક કાર્ય એપ્લિકેશનમાં લૉગ ઇન કરે છે, અને તેની સહી તે હસ્તાક્ષર કરેલા XML ની અંદર રહે છે. અંદરથી: એપ્લિકેશન, બ્રાઉઝર અને ઓળખ પ્રદાતા વચ્ચેનો લૉગિન ડાન્સ, એક એસર્શન કેવું દેખાય છે, શા મ

3:02 ↗
under-the-hood · gu · 23 સપ્ટે, 2026

જ્યારે કોઈ મોડેલ મરી જાય, ત્યારે અંદર શું થાય છે

એક AI મોડેલ મરતું નથી — તેને શટડાઉન તારીખ મળે છે, અને બીજા દિવસે સવારે, તમારો API કૉલ 404 રિટર્ન કરે છે: "મોડેલ અપ્રચલિત થઈ ગયું છે, અહીં વધુ જાણો." અંદર શું થાય છે: ફોર-સ્ટેટ પાઇપલાઇન (active → legac

3:15 ↗
under-the-hood · gu · 21 સપ્ટે, 2026

ક્લાઉડે RSA-896નું અવયવીકરણ કર્યું. RSA ખરેખર કેવી રીતે તૂટે છે તે અહીં છે

19 સપ્ટેમ્બરના રોજ એક એન્થ્રોપિક એન્જિનિયરે RSA-896 — એક 270-અંકનો પડકારરૂપ નંબર — ક્લાઉડે, ઓપન-સોર્સ CADO-NFS સીવનું GPU પોર્ટ અને દસ દિવસમાં 2,048 નિષ્ક્રિય GPUs પર ~30 GPU-વર્ષ સાથે અવયવીકરણ કર્યું

3:39 ↗