# शॉपिफाई ने इन्वेंटरी आरक्षणों को MySQL में स्थानांतरित कर दिया

Published: 2026-10-10

शॉपिफाई ने अपनी इन्वेंट्री आरक्षण प्रणाली को रेडिस से MySQL डेटाबेस में स्थानांतरित कर दिया, जिसमें पहले से ही इन्वेंट्री लेजर मौजूद था। व्यक्तिगत रूप से लॉक करने योग्य इकाई पंक्तियों का एक सीमित पूल समवर्ती चेकआउट को विभिन्न योग्य इकाइयों का चयन करने के लिए SKIP LOCKED का उपयोग करने की अनुमति देता है। यह डिज़ाइन ट्रांजैक्शन सीमाओं, प्राथमिक-कुंजी लेआउट, पुनःपूर्ति नियमों और चेकआउट के दौरान कनेक्शन होल्ड समय का अवलोकन करने पर भी निर्भर करता है।

Canonical: https://thedailydiff.dev/hi/video/shopify-reservation-locks/

## इस वीडियो में क्या शामिल है

- पुराने रेडिस क्वांटिटी-काउंटर मॉडल ने समवर्तीता को संभाला, लेकिन आरक्षण की सफाई और MySQL लेजर अपडेट एक ही स्थानीय परमाणु लेनदेन को साझा नहीं कर सके।
- प्रतिस्थापन प्रति उपलब्ध इकाई एक पंक्ति का उपयोग करता है, जो प्रति आइटम/स्थान संयोजन 1,000 पर सीमित है। एक खाली पूल समवर्ती अनुरोधों के साथ इनलाइन पुनःपूर्ति को ट्रिगर कर सकता है जो पुनःपूर्ति लॉक के पीछे प्रतीक्षा कर रहे हैं।
- समग्र प्राथमिक कुंजी (शॉप\_आईडी, इन्वेंट्री\_आइटम\_आईडी, इन्वेंट्री\_ग्रुप\_आईडी, आईडी) है। शॉपिफाई ने अपने प्रोटोटाइप में लॉक ओवरहेड को कम किया और गैप लॉक से बचने के लिए READ COMMITTED का उपयोग किया जो पुनःपूर्ति को बाधित कर रहे थे।
- आरक्षण रिकॉर्ड डालने से पहले पूल पंक्तियों को हटा देता है। कमिट करने से डेटाबेस लॉक जारी होते हैं जबकि संग्रहित होल्ड भुगतान के बाद भी बना रहता है; सफल भुगतान लेजर का दावा करता है और बाद के परमाणु लेनदेन में आरक्षण को हटा देता है।
- MySQL SKIP LOCKED को एक असंगत दृश्य के रूप में प्रलेखित करता है जो लॉक की गई पंक्तियों को छोड़ देता है। यह एक पूर्ण स्टॉक गिनती या उचित बारी-बारी से लेना स्थापित नहीं करता है, केवल पंक्ति-स्तर के ताले पर लागू होता है और स्टेटमेंट-आधारित प्रतिकृति के लिए असुरक्षित है।
- स्रोत उदाहरण में expires\_at शामिल है, लेकिन शॉपिफाई MySQL समाप्ति-सफाई एल्गोरिथम का दस्तावेजीकरण नहीं करता है। वीडियो की रिलीज/समाप्ति शाखा एक व्याख्यात्मक जीवनचक्र आवश्यकता है।
- अन्य चेकआउट कोड में कनेक्शन होल्ड समय अंतिम थ्रूपुट बाधा थी। शॉपिफाई ने दोनों प्रणालियों को शैडो-राइट किया, परिणामों की तुलना की और रेडिस किल-स्विच फॉलबैक के साथ धीरे-धीरे स्विच किया।

## अध्याय

- 0:00 MySQL में आरक्षण क्यों ले जाएं?
- 0:29 दो स्टोर जोखिम भरे क्यों थे?
- 0:52 लॉक करने योग्य इकाई क्या बनती है?
- 1:15 जब पूल खाली हो जाता है तो क्या होता है?
- 2:14 SKIP LOCKED क्या छोड़ देता है?
- 2:26 वास्तविक सीमा कहाँ थी?
- 2:38 मैं इस डिज़ाइन को क्यों शिप करूँगा?

## अनुवादित प्रतिलेख

मूल अंग्रेजी कथन से अनुवादित। उपलब्ध ऑडियो और कैप्शन YouTube द्वारा नियंत्रित होते हैं।

### MySQL में आरक्षण क्यों ले जाएं?

0:00 एक चेकआउट को तेज रहने के लिए रेडिस की आवश्यकता होती है। शॉपिफाई ने इन्वेंट्री आरक्षणों को MySQL में एक इकाई प्रति पंक्ति का उपयोग करके स्थानांतरित कर दिया सीमित पूल में। MySQL क्यों चुनें? आप तालों को सुरक्षित रूप से कैसे छोड़ते हैं? यह The Daily Diff है, पर्दे के पीछे। और तेज प्रश्न अभी भी एक सीमा से क्यों टकरा रहे थे? शॉपिफाई ऑनलाइन और व्यक्तिगत रूप से बेचने के लिए एक वाणिज्य मंच है। रेडिस एक इन-मेमोरी डेटा स्टोर है।

0:21 MySQL एक संबंधपरक डेटाबेस है, और शॉपिफाई ने पहले से ही अपना इन्वेंट्री लेजर रखा था वहां। एक आरक्षण संक्षेप में स्टॉक रखता है जबकि खरीदार भुगतान करता है।

### दो स्टोर जोखिम भरे क्यों थे?

0:29 उनके रेडिस मॉडल ने एक आइटम काउंटर को कम कर दिया। एक भुगतान किए गए ऑर्डर का दावा करने का मतलब MySQL लेजर को अपडेट करना और रेडिस को साफ करना था। वे अलग-अलग राइट्स स्टॉक को दो बार बेचे गए या अनुपलब्ध छोड़ सकते थे जब इसे बेचने योग्य होना चाहिए। पुराने मॉडल में स्थान जागरूकता की भी कमी थी। प्रतिस्थापन को कहीं से स्टॉक चुनना होगा जो ऑर्डर को पूरा कर सके। गलत महाद्वीप पर एक गोदाम एक उत्कृष्ट डेटाबेस प्रविष्टि और एक भयानक वितरण वादा बनाता है। पहले के MySQL प्रयासों ने एक मात्रा पंक्ति का उपयोग किया, इसलिए प्रतिस्पर्धी चेकआउट उसी

### लॉक करने योग्य इकाई क्या बनती है?

0:56 लॉक पर कतारबद्ध हो गए। एक स्प्रेडशीट सेल के चारों ओर एक मखमली रस्सी के बारे में सोचें। अधिक श्रमिकों को जोड़ने से केवल कतार लंबी होती है। शॉपिफाई ने लॉक करने योग्य वस्तु को बदल दिया। प्रत्येक उपलब्ध इकाई को अपनी पंक्ति मिलती है। एक लॉकिंग रीड इकाइयों को छोड़ देता है जो दूसरा लेनदेन रखता है और अन्य योग्य इकाइयों का चयन करता है। विभिन्न कर्मचारी विभिन्न पंक्तियों को प्राप्त कर सकते हैं, जबकि हॉट काउंटर उनके रास्ते से बाहर रहता है।

### जब पूल खाली हो जाता है तो क्या होता है?

1:15 वह पूल प्रति आइटम और स्थान पर एक हजार पंक्तियों पर सीमित है। पुनःपूर्ति लेजर से खींचती है। यदि यह खाली हो जाता है, तो आरक्षित पथ इनलाइन पुनःपूर्ति करता है, जिसमें प्रतिस्पर्धी अनुरोध एक पुनःपूर्ति लॉक के पीछे प्रतीक्षा कर रहे हैं। खाली पूल का मतलब खाली गोदाम नहीं है। आरक्षण चयनित पूल पंक्तियों को हटा देता है, फिर एक लेनदेन में आरक्षण रिकॉर्ड डालता है। कमिट डेटाबेस ताले जारी करता है।

1:35 रोलबैक परिवर्तनों को पूर्ववत करता है। आरक्षण भुगतान प्रसंस्करण के बाद संग्रहीत स्थिति के रूप में जीवित रहता है। सफल भुगतान लेजर का दावा करता है और आरक्षण को परमाणु रूप से हटा देता है। डेटाबेस ताले को कभी भी भुगतान फॉर्म की देखभाल करने की आवश्यकता नहीं होती है। उनकी समग्र प्राथमिक कुंजी दुकान, आइटम, समूह, फिर इकाई पहचान से शुरू होती है। लुकअप का मिलान करने से उनके प्रोटोटाइप में इंडेक्स लॉकिंग कम हो गई। उन्होंने गैप लॉक से बचने के लिए रीड कमिटेड का भी उपयोग किया जो पूल

1:57 पुनःपूर्ति को बाधित करते थे, और परिपत्र प्रतीक्षा को रोकने के लिए एक सुसंगत तालिका क्रम। प्रकाशित उदाहरण एक समाप्ति समय रिकॉर्ड करता है। छोड़े गए भुगतानों को अंततः स्टॉक जारी करने की आवश्यकता होती है, या शॉपिंग कार्ट एक मकान मालिक बन जाता है। शॉपिफाई की पोस्ट उस सफाई एल्गोरिथम को अनिर्दिष्ट छोड़ देती है, इसलिए यह आरेख जीवनचक्र की आवश्यकता को दर्शाता है। यहां पकड़ है।

### SKIP LOCKED क्या छोड़ देता है?

2:14 छोड़े गए ताले लॉक की गई पंक्तियों को बाहर कर देते हैं, इसलिए मैनुअल इसके परिणाम को एक असंगत दृश्य कहता है। यह न तो पूर्ण स्टॉक गिनती प्रदान करता है और न ही उचित बारी-बारी से लेना। उपलब्धता निर्णय और पुनःपूर्ति नियमों को इसके आसपास रखें।

### वास्तविक सीमा कहाँ थी?

2:26 और वह सीमा? अन्य चेकआउट कोड डेटाबेस कनेक्शन को बहुत देर तक पकड़े हुए थे। शॉपिफाई ने कॉलर्स को टैग किया और कनेक्शन होल्ड समय को मापा, फिर चेकआउट पथ को साफ किया और थ्रेड समवर्तीता पर फिर से विचार किया। तेज प्रश्न अभी भी क्वेरी के बाहर कतारबद्ध हो सकते हैं।

### मैं इस डिज़ाइन को क्यों शिप करूँगा?

2:38 उन्होंने रेडिस को आधिकारिक मानते हुए दोनों प्रणालियों को शैडो-राइट किया, परिणामों की तुलना की, फिर एक किल स्विच के साथ धीरे-धीरे स्विच किया। मेरा फैसला इसे SHIP IT है। मैं साझा लेनदेन सीमा और उस रोलबैक योग्य रोलआउट को SHIP IT करूँगा, पूरे चेकआउट पथ को इंस्ट्रूमेंटेड के साथ। इसके बारे में कोई प्रश्न है? इसे टिप्पणियों में डालें। और आज के लिए यही अंतर है।

2:54 मैं Axrisi से निको हूँ। जिम्मेदारी से मर्ज करें।

## स्रोत

- [We replaced Redis with MySQL for inventory reservations—and it scaled](https://shopify.engineering/scaling-inventory-reservations) — Shopify Engineering — Emilie Noel
- [Simplified reservation SQL embedded in Shopify's article](https://gist.github.com/CourtneySymons/cb5ecbe86331047aae166d5b1f1d555c) — Shopify Engineering / CourtneySymons on GitHub Gist
- [MySQL 8.0 — Locking Reads](https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html) — Oracle / MySQL Reference Manual
- [MySQL 8.0 — Transaction Isolation Levels](https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html) — Oracle / MySQL Reference Manual
- [What Is Shopify and How Does It Work?](https://www.shopify.com/blog/what-is-shopify) — Shopify
- [Redis quick starts](https://redis.io/docs/latest/develop/get-started/) — Redis documentation
- [What is MySQL?](https://dev.mysql.com/doc/refman/8.0/en/what-is-mysql.html) — Oracle / MySQL Reference Manual
