Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Redis

Redis डिस्ट्रिब्यूटेड लॉक्स में महारत हासिल करना: सिद्ध पैटर्न, सामान्य नुकसान और व्यावहारिक अनुप्रयोग

Redis डिस्ट्रिब्यूटेड लॉक्स में महारत हासिल करना: सिद्ध पैटर्न, सामान्य नुकसान और व्यावहारिक अनुप्रयोग

परिचय

डिस्ट्रिब्यूटेड लॉक्स सरल लगते हैं जब तक आप वास्तव में प्रोडक्शन में उन पर निर्भर नहीं होते।

एक प्रक्रिया को एक संसाधन तक विशेष पहुंच की आवश्यकता होती है। कई सर्वर चल रहे हैं। Redis बीच में बैठता है। विचार सीधा लगता है: Redis में एक लॉक रखें और आगे बढ़ें।

कुछ समय के लिए, यह दृष्टिकोण काम करता हुआ प्रतीत होता है। फिर एक प्रक्रिया क्रैश होती है, नेटवर्क विलंब होता है, या लेटेंसी बढ़ जाती है। अचानक, दो प्रक्रियाएं एक ही लॉक का दावा करती हैं, कोई प्रक्रिया इसका मालिक नहीं होती, या लॉक कभी रिलीज़ नहीं होता।

अधिकांश Redis लॉकिंग समस्याएं Redis के कारण नहीं होतीं। वे होती हैं क्योंकि डिस्ट्रिब्यूटेड लॉक्स को अक्सर गलत समझा जाता है। Redis समन्वय के लिए एक उपकरण प्रदान करता है, पूर्ण विशिष्टता की गारंटी नहीं।

डिस्ट्रिब्यूटेड लॉक वास्तव में क्या है

एक डिस्ट्रिब्यूटेड लॉक इन-मेमोरी म्यूटेक्स के समान नहीं है। यह पूर्ण गारंटी प्रदान नहीं करता, और यह विफलता को समाप्त नहीं कर सकता।

डिस्ट्रिब्यूटेड लॉक्स अविश्वसनीय वातावरण में काम करने वाले समन्वय तंत्र हैं। नेटवर्क विफल होते हैं, प्रक्रियाएं क्रैश होती हैं, और घड़ियां ड्रिफ्ट करती हैं। कोई भी लॉकिंग रणनीति जो पूर्ण व्यवहार मानती है, अंततः टूट जाएगी।

Redis लॉक्स बेस्ट-एफर्ट लॉक्स हैं। जब सही ढंग से डिज़ाइन किए जाते हैं, तो वे अत्यधिक प्रभावी होते हैं। जब लापरवाही से लागू किए जाते हैं, तो वे सूक्ष्म रेस कंडीशन्स और डेटा करप्शन पेश करते हैं।

Redis लॉक्स को सुरक्षित रूप से उपयोग करने में पहला कदम अपेक्षाओं को समायोजित करना है।

Redis लॉक्स कब समझ में आते हैं

Redis डिस्ट्रिब्यूटेड लॉक्स उपयुक्त हैं जब:

  • आप एक क्रिटिकल सेक्शन के समवर्ती निष्पादन को रोकने की आवश्यकता है
  • काम को कई सर्वरों में समन्वित किया जाना चाहिए
  • ऑपरेशन छोटा-जीवित है
  • रीट्राई स्वीकार्य हैं

सामान्य उपयोग के मामलों में जॉब डिडुप्लिकेशन, शेड्यूल्ड टास्क समन्वय, कैश रीबिल्ड्स, और डबल प्रोसेसिंग रोकना शामिल हैं।

Redis लॉक्स लंबे समय तक चलने वाले बिजनेस ट्रांजैक्शन, उपयोगकर्ता-सामना करने वाले क्रिटिकल वर्कफ्लो, या ऐसे ऑपरेशन के लिए खराब फिट हैं जिन्हें सुरक्षित रूप से रीट्राई नहीं किया जा सकता। यदि रीट्राई स्वीकार्य नहीं हैं, तो Redis लॉक्स गलत उपकरण हैं।

Redis में एकमात्र सुरक्षित लॉकिंग प्रिमिटिव

सबसे सुरक्षित Redis लॉकिंग प्रिमिटिव एक सिंगल एटॉमिक कमांड है:

SET key value NX EX ttl

यह कमांड एक लॉक तभी बनाता है जब यह पहले से मौजूद नहीं है, एक यूनिक मालिक मान असाइन करता है, और एक TTL सेट करता है ताकि लॉक स्वचालित रूप से समाप्त हो जाए।

कोई भी वैकल्पिक दृष्टिकोण रेस कंडीशन्स पेश करता है। TTL के बिना SETNX का उपयोग करना या एक अलग चरण में एक्सपायरेशन सेट करना विफलता के तहत टूट जाता है। TTL अनिवार्य है और जब कोई प्रक्रिया अप्रत्याशित रूप से क्रैश होती है तो सिस्टम की रक्षा करता है।

लॉक TTL अनिवार्य क्यों है

TTL के बिना, एक Redis लॉक हमेशा के लिए जीवित रह सकता है। यदि कोई प्रक्रिया लॉक रखते हुए क्रैश होती है, तो सिस्टम चुपचाप रुक जाता है।

TTL लॉक्स को सेल्फ-हीलिंग बनाता है। जब विफलता होती है, तो लॉक अंततः समाप्त हो जाता है और प्रगति को फिर से शुरू करने की अनुमति देता है। इसके परिणामस्वरूप संक्षिप्त ओवरलैप हो सकता है, लेकिन वह ट्रेडऑफ जानबूझकर है।

जो लॉक्स कभी समाप्त नहीं होते, वे बिल्कुल भी लॉक न होने से अधिक खतरनाक हैं।

लॉक स्वामित्व और सुरक्षित रिलीज़

एक Redis लॉक को केवल उस प्रक्रिया द्वारा रिलीज़ किया जाना चाहिए जिसने इसे प्राप्त किया था। यही कारण है कि लॉक मान यूनिक पहचानकर्ता होने चाहिए, न कि कॉन्स्टेंट स्ट्रिंग्स।

लॉक रिलीज़ करने के लिए स्वामित्व सत्यापित करने की आवश्यकता होती है। सुरक्षित दृष्टिकोण एक Lua स्क्रिप्ट का उपयोग करना है जो संग्रहीत मान की जांच करती है और लॉक को केवल तभी हटाती है जब यह अपेक्षित मालिक से मेल खाता है।

यह एक रेस कंडीशन को रोकता है जहां एक लॉक समाप्त होता है, दूसरी प्रक्रिया द्वारा प्राप्त किया जाता है, और फिर मूल धारक द्वारा गलती से हटा दिया जाता है।

सुरक्षित लॉक अवधि चुनना

लॉक TTL को संरक्षित ऑपरेशन के अधिकतम अपेक्षित निष्पादन समय से अधिक होना चाहिए। औसत निष्पादन समय का उपयोग करना पर्याप्त नहीं है।

यदि लॉक तब समाप्त होता है जब काम अभी भी चल रहा है, तो दूसरी प्रक्रिया इसे प्राप्त कर सकती है और वही काम समवर्ती रूप से कर सकती है। इससे डुप्लिकेशन या करप्शन हो सकता है।

साथ ही, अत्यधिक लंबे TTLs रिकवरी में देरी करते हैं जब कुछ गलत होता है। लॉक अवधि एक संतुलन है जो सिस्टम के बदलने के साथ विकसित होता है।

लॉक्ड काम को छोटा और बाउंडेड रखना सबसे सुरक्षित दृष्टिकोण है।

लॉक एक्सटेंशन और हार्टबीट्स

कुछ ऑपरेशन अपेक्षा से अधिक समय लेते हैं। समय-समय पर TTL को रीफ्रेश करके लॉक्स को बढ़ाना संभव है, लेकिन यह जटिलता और नए विफलता मोड जोड़ता है।

केवल लॉक मालिक को TTL बढ़ाने की अनुमति दी जानी चाहिए, और स्वामित्व खोने पर एक्सटेंशन तुरंत रुक जाना चाहिए।

कई मामलों में, काम को छोटे टुकड़ों में रीडिजाइन करना लॉक एक्सटेंशन लॉजिक लागू करने से अधिक सुरक्षित है।

Redlock बहस

Redlock एक एल्गोरिदम है जो लॉक सुरक्षा में सुधार के लिए कई Redis इंस्टेंसेस का उपयोग करता है। यह विवादास्पद और ऑपरेशनली जटिल भी है।

अधिकांश सिस्टम के लिए, Redlock लाभ से अधिक जटिलता पेश करता है। यह टाइमिंग मान्यताओं पर निर्भर करता है जो वास्तविक दुनिया के वातावरण में गारंटी देना मुश्किल है।

यदि Redlock-स्तर की गारंटी की आवश्यकता है, तो Redis उपयुक्त उपकरण नहीं हो सकता। ट्रांजैक्शनल लॉकिंग वाले डेटाबेस या विशेष समन्वय प्रणालियाँ बेहतर फिट हो सकती हैं।

अधिकांश Redis उपयोग के मामलों के लिए, उचित TTL-आधारित लॉकिंग के साथ एकल Redis इंस्टेंस पर्याप्त है।

लॉक्स ट्रांजैक्शन नहीं हैं

Redis लॉक्स ऑपरेशन्स को ट्रांजैक्शनल नहीं बनाते। वे विफलता होने पर स्वचालित रोलबैक या संगति की गारंटी प्रदान नहीं करते।

लॉक्स समवर्ती को कम करते हैं; वे विफलता को समाप्त नहीं करते। क्रिटिकल सेक्शन्स को आइडेम्पोटेंट होने के लिए डिज़ाइन किया जाना चाहिए ताकि दोहराया निष्पादन नुकसान न पहुंचाए।

यह डिज़ाइन सिद्धांत लॉकिंग-संबंधी बग्स के जोखिम को काफी कम करता है।

जब Redis डाउन होता है तो क्या होता है

जब Redis डाउन होता है या रीस्टार्ट होता है, तो सभी लॉक गायब हो जाते हैं। यह अपेक्षित व्यवहार है।

जब Redis वापस ऑनलाइन आता है, तो कई प्रक्रियाएं एक साथ लॉक प्राप्त कर सकती हैं और काम शुरू कर सकती हैं। सिस्टम को इस संभावना को सहन करना चाहिए।

यदि Redis रीस्टार्ट के दौरान लॉक खोने से करप्शन होता है, तो लॉकिंग डिज़ाइन असुरक्षित है और इस पर पुनर्विचार करने की आवश्यकता है।

प्रोडक्शन में लॉक्स की निगरानी

Redis लॉक्स कभी अदृश्य नहीं होने चाहिए। टीमों को निगरानी करनी चाहिए कि कितने लॉक मौजूद हैं, वे कितने समय तक जीवित रहते हैं, और लॉक अधिग्रहण कितनी बार विफल होता है।

असामान्य रूप से लंबे समय तक रहने वाले लॉक्स रुकी हुई प्रक्रियाओं का संकेत देते हैं। बार-बार अधिग्रहण विफलताएं विवाद या गलत लॉक डिजाइन का सुझाव देती हैं।

दृश्यता सुरक्षित संचालन के लिए आवश्यक है।

सामान्य Redis लॉक एंटी-पैटर्न

सामान्य गलतियों में TTL के बिना SETNX का उपयोग करना, लॉक स्वामित्व के लिए कॉन्स्टेंट मानों का उपयोग करना, लॉक्स को अंधाधुंध हटाना, लंबे समय तक चलने वाले कार्यों के लिए लॉक्स रखना, और यह मानना कि लॉक्स शुद्धता की गारंटी देते हैं।

ये एंटी-पैटर्न वास्तविक दुनिया के प्रोडक्शन आउटेज में अक्सर दिखाई देते हैं।

एक व्यावहारिक लॉकिंग चेकलिस्ट

एक सुरक्षित Redis लॉकिंग कार्यान्वयन में शामिल हैं:

  • TTL के साथ लॉक कुंजियाँ
  • यूनिक लॉक स्वामित्व मान
  • रिलीज़ पर स्वामित्व सत्यापन
  • छोटे-जीवित क्रिटिकल सेक्शन्स
  • आइडेम्पोटेंट ऑपरेशन्स
  • टेस्टेड विफलता पथ

यदि इनमें से कोई भी गायब है, तो लॉकिंग डिज़ाइन पर पुनर्विचार किया जाना चाहिए।

Redis लॉक्स के लिए एक स्वस्थ मानसिक मॉडल

Redis लॉक्स सीटबेल्ट हैं, एयरबैग नहीं। वे नुकसान कम करते हैं लेकिन दुर्घटनाओं को पूरी तरह से नहीं रोकते।

सावधानी से उपयोग किए जाने पर, वे डिस्ट्रिब्यूटेड सिस्टम में समन्वय को सरल बनाते हैं। लापरवाही से उपयोग किए जाने पर, वे सूक्ष्म और लगातार बग्स पेश करते हैं।

सारांश

डिस्ट्रिब्यूटेड लॉकिंग कठिन है क्योंकि विफलता अपरिहार्य है। Redis एक तेज, सरल और व्यावहारिक लॉकिंग तंत्र प्रदान करता है, पूर्ण नहीं।

विफलता के लिए डिज़ाइन करें, लॉक्स को छोटा रखें, TTLs का लगातार उपयोग करें, और सुनिश्चित करें कि ऑपरेशन्स रीट्राई करने के लिए सुरक्षित हैं। जब सही ढंग से उपयोग किया जाता है, तो Redis डिस्ट्रिब्यूटेड लॉक्स प्रोडक्शन सिस्टम में विश्वसनीय और प्रभावी उपकरण हैं।

  1. Tkinter विंडो में लेबल्स को डायनामिकली कैसे जोड़ें/हटाएं/अपडेट करें? Tkinter विंडो में लेबल्स को डायनामिकली कैसे जोड़ें/हटाएं/अपडेट करें?

    हम टेक्स्ट और इमेज प्रदर्शित करने के लिए Tkinter Label विजेट का उपयोग कर सकते हैं। Label विजेट को कॉन्फ़िगर करके, हम विजेट के टेक्स्ट, इमेज और अन्य प्रॉपर्टीज को डायनामिकली बदल सकते हैं।Label विजेट को डायनामिकली अपडेट करने के लिए, हम या तो config(**options) या इंलाइन कॉन्फ़िगरेशन मेथड का उपयोग कर सक

  1. Android में वर्तमान थ्रेड ID कैसे प्राप्त करें? Android में वर्तमान थ्रेड ID कैसे प्राप्त करें?

    Android में वर्तमान थ्रेड की ID प्राप्त करना उदाहरण में जाने से पहले, हमें पता होना चाहिए कि थ्रेड क्या है। एक थ्रेड एक हल्का सब-प्रोसेस है, यह UI को बाधित किए बिना बैकग्राउंड ऑपरेशन करने जा रहा है। यह उदाहरण दर्शाता है कि Android में वर्तमान थ्रेड ID कैसे प्राप्त करें। चरण 1: नया प्रोजेक्ट बनाएं A

  1. RedisDays न्यूयॉर्क 2022: AI, ML, और परफॉरमेंस-फर्स्ट डेटा स्टैक पर हाइलाइट्स RedisDays न्यूयॉर्क 2022: AI, ML, और परफॉरमेंस-फर्स्ट डेटा स्टैक पर हाइलाइट्स

    लंदन में रीयल-टाइम डेटा पर केंद्रित एक दिन के साथ चीजों को शुरू करने के बाद, सैन फ्रांसिस्को में एक डेवलपर-केंद्रित दिन के बाद, RedisDays 2022 न्यूयॉर्क में कृत्रिम बुद्धिमत्ता / मशीन लर्निंग (AI/ML) में नवीनतम रेडिस विकास के बारे में सत्रों के एक दिन के साथ समाप्त हुआ। RedisDays न्यूयॉर्क सत्रों ने