ഷോപ്പിഫൈ ഇൻവെന്ററി റിസർവേഷനുകൾ MySQL-ലേക്ക് മാറ്റി
ഷോപ്പിഫൈ അതിൻ്റെ ഇൻവെന്ററി റിസർവേഷൻ സിസ്റ്റം റെഡിസിൽ നിന്ന്, ഇൻവെന്ററി ലെഡ്ജർ സൂക്ഷിച്ചിരുന്ന MySQL ഡാറ്റാബേസിലേക്ക് മാറ്റി.
ഷോപ്പിഫൈ അതിൻ്റെ ഇൻവെന്ററി റിസർവേഷൻ സിസ്റ്റം റെഡിസിൽ നിന്ന്, ഇൻവെന്ററി ലെഡ്ജർ സൂക്ഷിച്ചിരുന്ന MySQL ഡാറ്റാബേസിലേക്ക് മാറ്റി. വ്യക്തിഗതമായി ലോക്ക് ചെയ്യാവുന്ന യൂണിറ്റ് വരികളുടെ ഒരു ബൗണ്ടഡ് പൂൾ, ഒരേസമയം ചെക്കൗട്ടുകൾക്ക് SKIP LOCKED ഉപയോഗിച്ച് വ്യത്യസ്ത യോഗ്യമായ യൂണിറ്റുകൾ തിരഞ്ഞെടുക്കാൻ അനുവദിക്കുന്നു. ഇടപാട് പരിധികൾ, പ്രാഥമിക കീ ലേഔട്ട്, റീപ്ലനിഷ്മെൻ്റ് നിയമങ്ങൾ, ചെക്കൗട്ടിലുടനീളമുള്ള കണക്ഷൻ ഹോൾഡ് സമയം എന്നിവയെയും ഈ ഡിസൈൻ ആശ്രയിച്ചിരിക്കുന്നു.
എഴുതിയ പതിപ്പ് വായിക്കുക (ഇംഗ്ലീഷ്) ↗
ഈ വീഡിയോയിൽ ഉൾപ്പെടുന്ന കാര്യങ്ങൾ
- പഴയ റെഡിസ് ക്വാണ്ടിറ്റി-കൗണ്ടർ മോഡൽ കൺകറൻസി കൈകാര്യം ചെയ്തിരുന്നു, പക്ഷേ റിസർവേഷൻ ക്ലീനപ്പും MySQL ലെഡ്ജർ അപ്ഡേറ്റും ഒരു ഒറ്റ ലോക്കൽ അറ്റോമിക് ട്രാൻസാക്ഷൻ പങ്കിടാൻ കഴിഞ്ഞിരുന്നില്ല.
- ഓരോ ഇനം/ലൊക്കേഷൻ കോമ്പിനേഷനും 1,000 യൂണിറ്റുകളായി പരിമിതപ്പെടുത്തിയ ഒരു പൂളിൽ ലഭ്യമായ ഓരോ യൂണിറ്റിനും ഒരു വരി വീതം മാറ്റിസ്ഥാപിക്കുന്നു. ഒരു ഒഴിഞ്ഞ പൂളിന്, റീപ്ലനിഷ്മെൻ്റ് ലോക്കിന് പിന്നിൽ കാത്തിരിക്കുന്ന ഒരേസമയം അഭ്യർത്ഥനകളോടെ ഇൻലൈൻ റീപ്ലനിഷ്മെൻ്റ് ട്രിഗർ ചെയ്യാൻ കഴിയും.
- കോമ്പോസിറ്റ് പ്രൈമറി കീ (shop_id, inventory_item_id, inventory_group_id, id) ആണ്. ഷോപ്പിഫൈ അതിൻ്റെ പ്രോട്ടോടൈപ്പിൽ ലോക്ക് ഓവർഹെഡ് കുറയ്ക്കുകയും റീപ്ലനിഷ്മെൻ്റ് തടസ്സപ്പെടുത്തിയ ഗ്യാപ് ലോക്കുകൾ ഒഴിവാക്കാൻ READ COMMITTED ഉപയോഗിക്കുകയും ചെയ്തു.
- റിസർവേഷൻ റെക്കോർഡുകൾ ചേർക്കുന്നതിന് മുമ്പ് റിസർവ് പൂൾ വരികൾ ഇല്ലാതാക്കുന്നു. കമ്മിറ്റ് ചെയ്യുന്നത് ഡാറ്റാബേസ് ലോക്കുകൾ റിലീസ് ചെയ്യുന്നു, അതേസമയം സംഭരിച്ചിരിക്കുന്ന ഹോൾഡ് പേയ്മെൻ്റിലുടനീളം നിലനിൽക്കുന്നു; വിജയകരമായ പേയ്മെൻ്റ് ലെഡ്ജർ ക്ലെയിം ചെയ്യുകയും പിന്നീട് ഒരു അറ്റോമിക് ട്രാൻസാക്ഷനിൽ റിസർവേഷൻ നീക്കം ചെയ്യുകയും ചെയ്യുന്നു.
- ലോക്ക് ചെയ്ത വരികൾ ഒഴിവാക്കുന്ന ഒരു പൊരുത്തപ്പെടാത്ത കാഴ്ചയാണ് SKIP LOCKED എന്ന് MySQL രേഖപ്പെടുത്തുന്നു. ഇത് ഒരു പൂർണ്ണമായ സ്റ്റോക്ക് കണക്കോ ന്യായമായ ഊഴമെടുക്കലോ സ്ഥാപിക്കുന്നില്ല, റോ-ലെവൽ ലോക്കുകൾക്ക് മാത്രമേ ഇത് ബാധകമാകൂ, കൂടാതെ സ്റ്റേറ്റ്മെൻ്റ് അധിഷ്ഠിത റെപ്ലിക്കേഷന് ഇത് സുരക്ഷിതമല്ല.
- ഉറവിട ഉദാഹരണത്തിൽ expires_at ഉൾപ്പെടുന്നു, എന്നാൽ MySQL കാലഹരണപ്പെടൽ-ക്ലീനപ്പ് അൽഗോരിതം Shopify രേഖപ്പെടുത്തുന്നില്ല. വീഡിയോയിലെ റിലീസ്/കാലഹരണപ്പെടൽ ബ്രാഞ്ച് ഒരു വിശദീകരണ ലൈഫ് സൈക്കിൾ ആവശ്യകതയാണ്.
- മറ്റ് ചെക്കൗട്ട് കോഡിലെ കണക്ഷൻ ഹോൾഡ് സമയം അവസാനത്തെ ത്രൂപുട്ട് തടസ്സമായിരുന്നു. ഷോപ്പിഫൈ രണ്ട് സിസ്റ്റങ്ങളും ഷാഡോ-എഴുതുകയും ഫലങ്ങൾ താരതമ്യം ചെയ്യുകയും ഒരു റെഡിസ് കിൽ-സ്വിച്ച് ഫാൾബാക്കോടെ ക്രമേണ മാറുകയും ചെയ്തു.
വിവർത്തനം ചെയ്ത ട്രാൻസ്ക്രിപ്റ്റ്
യഥാർത്ഥ ഇംഗ്ലീഷ് ആഖ്യാനത്തിൽ നിന്ന് വിവർത്തനം ചെയ്തത്. ലഭ്യമായ ഓഡിയോയും അടിക്കുറിപ്പുകളും YouTube നിയന്ത്രിക്കുന്നു.
എന്തുകൊണ്ടാണ് റിസർവേഷനുകൾ MySQL-ലേക്ക് മാറ്റിയത്?
0:00 വേഗത്തിലാക്കാൻ ഒരു ചെക്കൗട്ടിന് റെഡിസ് ആവശ്യമാണ്. ഷോപ്പിഫൈ ഇൻവെന്ററി റിസർവേഷനുകൾ MySQL-ലേക്ക് മാറ്റി, ഓരോ യൂണിറ്റിനും ഒരു വരി വീതം ഒരു ബൗണ്ടഡ് പൂളിൽ. എന്തുകൊണ്ട് MySQL തിരഞ്ഞെടുത്തു? ലോക്കുകൾ സുരക്ഷിതമായി എങ്ങനെ ഒഴിവാക്കാം? ഇത് ദി ഡെയ്ലി ഡിഫ് ആണ്, അണ്ടർ ദി ഹുഡ്. എന്നിട്ടും എന്തുകൊണ്ടാണ് വേഗതയേറിയ ചോദ്യങ്ങൾ ഒരു പരിധിയിലെത്തിയത്? ഓൺലൈനിലും നേരിട്ടും വിൽക്കുന്നതിനുള്ള ഒരു കൊമേഴ്സ് പ്ലാറ്റ്ഫോമാണ് ഷോപ്പിഫൈ. റെഡിസ് ഒരു ഇൻ-മെമ്മറി ഡാറ്റാ സ്റ്റോർ ആണ്.
0:21 MySQL ഒരു റിലേഷണൽ ഡാറ്റാബേസ് ആണ്, ഷോപ്പിഫൈ അതിൻ്റെ ഇൻവെന്ററി ലെഡ്ജർ അവിടെ സൂക്ഷിച്ചിരുന്നു. ഒരു വാങ്ങുന്നയാൾ പണമടയ്ക്കുമ്പോൾ ഒരു റിസർവേഷൻ സ്റ്റോക്ക് ചുരുങ്ങിയ സമയം പിടിച്ചു നിർത്തുന്നു.
എന്തുകൊണ്ടാണ് രണ്ട് സ്റ്റോറുകൾ അപകടകരമായത്?
0:29 അവരുടെ റെഡിസ് മോഡൽ ഒരു ഇനം കൗണ്ടർ കുറച്ചു. പണമടച്ച ഒരു ഓർഡർ ക്ലെയിം ചെയ്യുക എന്നാൽ MySQL ലെഡ്ജർ അപ്ഡേറ്റ് ചെയ്യുകയും റെഡിസ് വൃത്തിയാക്കുകയും ചെയ്യുക എന്നാണ് അർത്ഥമാക്കുന്നത്. ആ പ്രത്യേക എഴുത്തുകൾ സ്റ്റോക്ക് രണ്ടുതവണ വിറ്റഴിക്കുകയോ വിൽക്കാൻ കഴിയേണ്ട സമയത്ത് ലഭ്യമല്ലാതാക്കുകയോ ചെയ്തേക്കാം. പഴയ മോഡലിന് ലൊക്കേഷൻ അവബോധവും കുറവായിരുന്നു. മാറ്റിസ്ഥാപിക്കുന്ന സിസ്റ്റം ഓർഡർ നിറവേറ്റാൻ കഴിയുന്ന ഒരിടത്ത് നിന്ന് സ്റ്റോക്ക് തിരഞ്ഞെടുക്കണം. തെറ്റായ ഭൂഖണ്ഡത്തിലെ ഒരു വെയർഹൗസ് മികച്ച ഡാറ്റാബേസ് എൻട്രിയും മോശം ഡെലിവറി വാഗ്ദാനവുമാണ്. മുമ്പത്തെ MySQL ശ്രമങ്ങൾ ഒരു ക്വാണ്ടിറ്റി റോ ഉപയോഗിച്ചു, അതിനാൽ മത്സരിക്കുന്ന ചെക്കൗട്ടുകൾ ഒരേ
ലോക്ക് ചെയ്യാവുന്ന യൂണിറ്റ് എന്തായി മാറും?
0:56 ലോക്കിൽ വരി നിന്നു. ഒരു സ്പ്രെഡ്ഷീറ്റ് സെല്ലിന് ചുറ്റും ഒരു വെൽവെറ്റ് റോപ്പ് സങ്കൽപ്പിക്കുക. കൂടുതൽ തൊഴിലാളികളെ ചേർക്കുന്നത് ക്യൂവിൻ്റെ ദൈർഘ്യം കൂട്ടുകയേയുള്ളൂ. ഷോപ്പിഫൈ ലോക്ക് ചെയ്യാവുന്ന ഒബ്ജക്റ്റ് മാറ്റി. ഓരോ ലഭ്യമായ യൂണിറ്റിനും അതിൻ്റേതായ ഒരു വരി ലഭിക്കുന്നു. ഒരു ലോക്കിംഗ് റീഡ് മറ്റൊന്ന് ട്രാൻസാക്ഷൻ കൈവശം വെച്ചിരിക്കുന്ന യൂണിറ്റുകൾ ഒഴിവാക്കുകയും മറ്റ് യോഗ്യമായ യൂണിറ്റുകൾ തിരഞ്ഞെടുക്കുകയും ചെയ്യുന്നു. വ്യത്യസ്ത തൊഴിലാളികൾക്ക് വ്യത്യസ്ത വരികൾ നേടാൻ കഴിയും, അതേസമയം ഹോട്ട് കൗണ്ടർ അവരുടെ വഴിയിൽ നിന്ന് മാറി നിൽക്കുന്നു.
പൂൾ ഒഴിഞ്ഞാൽ എന്ത് സംഭവിക്കും?
1:15 ഓരോ ഇനത്തിനും ലൊക്കേഷനും ആയിരം വരികളായി ആ പൂൾ പരിമിതപ്പെടുത്തിയിരിക്കുന്നു. റീപ്ലനിഷ്മെൻ്റ് ലെഡ്ജറിൽ നിന്ന് എടുക്കുന്നു. ഒഴിഞ്ഞാൽ, റിസർവ്വ് പാത ഇൻലൈനായി റീപ്ലനിഷ് ചെയ്യുന്നു, മത്സരിക്കുന്ന അഭ്യർത്ഥനകൾ ഒരു റീപ്ലനിഷ്മെൻ്റ് ലോക്കിന് പിന്നിൽ കാത്തിരിക്കുന്നു. ഒഴിഞ്ഞ പൂൾ എന്നാൽ ഒഴിഞ്ഞ വെയർഹൗസ് എന്നല്ല അർത്ഥമാക്കുന്നത്. റിസർവ് തിരഞ്ഞെടുത്ത പൂൾ വരികൾ ഇല്ലാതാക്കുന്നു, തുടർന്ന് ഒരു ട്രാൻസാക്ഷനിൽ റിസർവേഷൻ റെക്കോർഡുകൾ ചേർക്കുന്നു. കമ്മിറ്റ് ചെയ്യുന്നത് ഡാറ്റാബേസ് ലോക്കുകൾ റിലീസ് ചെയ്യുന്നു.
1:35 റോൾബാക്ക് മാറ്റങ്ങൾ റദ്ദാക്കുന്നു. റിസർവേഷൻ പേയ്മെൻ്റ് പ്രോസസ്സിംഗിനെ ഒരു സംഭരിച്ച അവസ്ഥയായി അതിജീവിക്കുന്നു. വിജയകരമായ പേയ്മെൻ്റ് ലെഡ്ജർ ക്ലെയിം ചെയ്യുകയും റിസർവേഷൻ അറ്റോമികമായി നീക്കം ചെയ്യുകയും ചെയ്യുന്നു. ഡാറ്റാബേസ് ലോക്കുകൾക്ക് ഒരിക്കലും പേയ്മെൻ്റ് ഫോമിന് കാവലിരിക്കേണ്ടതില്ല. അവരുടെ കോമ്പോസിറ്റ് പ്രൈമറി കീ ഷോപ്പ്, ഇനം, ഗ്രൂപ്പ്, പിന്നീട് യൂണിറ്റ് ഐഡൻ്റിറ്റി എന്നിവയിൽ തുടങ്ങുന്നു. തിരയലുമായി പൊരുത്തപ്പെടുന്നത് അവരുടെ പ്രോട്ടോടൈപ്പിലെ ഇൻഡക്സ് ലോക്കിംഗ് കുറച്ചു. പൂൾ റീപ്ലനിഷ്മെൻ്റ് തടഞ്ഞ ഗ്യാപ് ലോക്കുകൾ ഒഴിവാക്കാൻ അവർ read committed-ഉം,
1:57 വൃത്താകൃതിയിലുള്ള കാത്തിരിപ്പുകൾ തടയാൻ ഒരു സ്ഥിരമായ ടേബിൾ ഓർഡറും ഉപയോഗിക്കുന്നു. പ്രസിദ്ധീകരിച്ച ഉദാഹരണം ഒരു കാലഹരണപ്പെടൽ സമയം രേഖപ്പെടുത്തുന്നു. ഉപേക്ഷിക്കപ്പെട്ട പേയ്മെൻ്റുകൾക്ക് ഒടുവിൽ സ്റ്റോക്ക് റിലീസ് ചെയ്യേണ്ടതുണ്ട്, അല്ലെങ്കിൽ ഷോപ്പിംഗ് കാർട്ട് ഒരു ഭൂവുടമയായി മാറും. Shopify-യുടെ പോസ്റ്റ് ആ ക്ലീനപ്പ് അൽഗോരിതം വ്യക്തമാക്കുന്നില്ല, അതിനാൽ ഈ ഡയഗ്രം ലൈഫ് സൈക്കിൾ ആവശ്യകത കാണിക്കുന്നു. ഇതാണ് കുഴപ്പം.
SKIP LOCKED എന്താണ് ഒഴിവാക്കുന്നത്?
2:14 ലോക്ക് ചെയ്ത വരികളെ SKIP LOCKED ഒഴിവാക്കുന്നു, അതിനാൽ മാനുവൽ അതിൻ്റെ ഫലത്തെ ഒരു പൊരുത്തപ്പെടാത്ത കാഴ്ച എന്ന് വിളിക്കുന്നു. ഇത് ഒരു പൂർണ്ണമായ സ്റ്റോക്ക് കണക്കോ ന്യായമായ ഊഴമെടുക്കലോ നൽകുന്നില്ല. ലഭ്യത തീരുമാനവും അതിൻ്റെ ചുറ്റുമുള്ള റീപ്ലനിഷ്മെൻ്റ് നിയമങ്ങളും നിലനിർത്തുക.
യഥാർത്ഥ സീലിംഗ് എവിടെയായിരുന്നു?
2:26 ആ സീലിംഗോ? മറ്റ് ചെക്കൗട്ട് കോഡ് ഡാറ്റാബേസ് കണക്ഷനുകൾ വളരെ നേരം പിടിച്ചു നിർത്തി. ഷോപ്പിഫൈ കോളർമാരെ ടാഗ് ചെയ്യുകയും കണക്ഷൻ ഹോൾഡ് സമയം അളക്കുകയും ചെയ്തു, തുടർന്ന് ചെക്കൗട്ട് പാത വൃത്തിയാക്കുകയും ത്രെഡ് കൺകറൻസി വീണ്ടും പരിശോധിക്കുകയും ചെയ്തു. വേഗതയേറിയ ചോദ്യങ്ങൾക്ക് ഇപ്പോഴും ചോദ്യത്തിന് പുറത്ത് ക്യൂ നിൽക്കാൻ കഴിയും.
എന്തുകൊണ്ടാണ് ഞാൻ ഈ ഡിസൈൻ അയയ്ക്കുന്നത്?
2:38 അവർ റെഡിസ് ആധികാരികമാക്കി രണ്ട് സിസ്റ്റങ്ങളും ഷാഡോ-എഴുതി, ഫലങ്ങൾ താരതമ്യം ചെയ്യുകയും ഒരു കിൽ സ്വിച്ച് ഉപയോഗിച്ച് ക്രമേണ മാറുകയും ചെയ്തു. എൻ്റെ വിധി SHIP IT എന്നാണ്. പൂർണ്ണമായ ചെക്കൗട്ട് പാത ഇൻസ്ട്രുമെൻ്റ് ചെയ്ത്, പങ്കിട്ട ട്രാൻസാക്ഷൻ ബൗണ്ടറിയും റോൾബാക്കബിൾ റോളൗട്ടും ഞാൻ അയയ്ക്കും. ഈ വിഷയത്തിൽ എന്തെങ്കിലും ചോദ്യമുണ്ടോ? അത് കമൻ്റുകളിൽ ഇടുക. അതാണ് ഇന്നത്തെ ഡിഫ്. ഞാൻ Axrisi-ൽ നിന്നുള്ള നിക്കോ ആണ്.
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



