दिलचस्प पोस्ट
कस्टमएरर्स और एपीआईआरर्स के बीच अंतर क्या है? जैस्मीन जावास्क्रिप्ट परीक्षण – toBe बनाम एक्सेल क्या किसी ऑब्जेक्ट के स्टैक आवंटन को रोकने के लिए संभव है और इसे केवल 'नया' के साथ तत्काल बनाया जा सकता है? Json.net का उपयोग करने के लिए सी # जेनेरिक सूची को कैसे परिवर्तित करें? मैं स्ट्रिंग ऑब्जेक्ट को हैश ऑब्जेक्ट में कैसे रूपांतरित कर सकता हूं? कोणीय 2.0 अंतर @View @Component NULL + int का नतीजा क्या है? कोणीय HTML बाइंडिंग Android वैश्विक चर ओबैक जेडीके 64 बिट के साथ उबंटू 13.04 पर मेरे ग्रहण इंडिगो दुर्घटना क्यों होती है? क्यों जावा में मुख्य विधि हमेशा तर्कों की आवश्यकता है? Ffmpeg का उपयोग कर किसी ऑडियो फ़ाइल के निर्दिष्ट अनुभागों को म्यूट करें कैसे प्रोग्राम करने के लिए iPhone म्यूट स्विच समझ? मोबाइल वेब के लिए अधिकतम-डिवाइस-चौड़ाई और अधिकतम-चौड़ाई के बीच क्या अंतर है? एंड्रॉइड ऑडियोरेकॉर्ड कक्षा – प्रक्रिया लाइव माइक्रो ऑडियो जल्दी, कॉलबैक फ़ंक्शन को सेट अप करें

वितरित अनुक्रम संख्या पीढ़ी?

मैंने आम तौर पर अतीत में डेटाबेस अनुक्रमों का उपयोग कर अनुक्रम संख्या पीढ़ी को लागू किया है।

उदाहरण के लिए पोस्टग्रेस का उपयोग सीरियल टाइप http://www.neilconway.org/docs/sequences/

मैं उत्सुक हूं, हालांकि बड़ी डिस्ट्रीब्यूटेड सिस्टमों के लिए अनुक्रम संख्या कैसे पैदा की जाती है, जहां कोई डेटाबेस नहीं है क्या किसी के पास किसी क्लाइंट के लिए थ्रेड सुरक्षित तरीके से अनुक्रम संख्या पीढ़ी को प्राप्त करने के लिए सबसे अच्छा अभ्यास का कोई अनुभव या सुझाव है?

Solutions Collecting From Web of "वितरित अनुक्रम संख्या पीढ़ी?"

ठीक है, यह एक बहुत पुराना सवाल है, जिसे मैं पहले देख रहा हूं।

आपको अनुक्रम संख्याओं और अद्वितीय आईडी के बीच अंतर करने की ज़रूरत होगी (वैकल्पिक रूप से) किसी विशिष्ट मानदंड (आमतौर पर पीढ़ी के समय) द्वारा ढीला क्रमबद्ध रूप से क्रमबद्ध। सही अनुक्रम संख्याओं का ये अर्थ है कि अन्य सभी श्रमिकों ने क्या किया है, और जैसा कि साझा राज्य की आवश्यकता है वितरित, उच्च-स्तरीय तरीके से ऐसा करने का कोई आसान तरीका नहीं है आप नेटवर्क के प्रसारण, प्रत्येक कार्यकर्ता के लिए विंडो वाले श्रेणियां, और अनन्य कार्यकर्ता आईडी के लिए हैश तालिका वितरित जैसी चीज़ों पर गौर कर सकते हैं, लेकिन यह बहुत काम है

अद्वितीय आईडी एक और मामला है, विकेंद्रीकृत तरीके से अद्वितीय आईडी बनाने के कई अच्छे तरीके हैं:

क) आप ट्विटर के स्नोफ्लैक्स आईडी नेटवर्क सेवा का उपयोग कर सकते हैं। हिमपात का एक प्रकार है:

  • नेटवर्क सेवा, अर्थात आप एक अद्वितीय आईडी प्राप्त करने के लिए एक नेटवर्क कॉल करते हैं;
  • जो पीढ़ी के समय के अनुसार 64 बिट अद्वितीय आईडी का उत्पादन करता है;
  • और सेवा अत्यधिक स्केलेबल है और (संभावित रूप से) अत्यधिक उपलब्ध है; प्रत्येक उदाहरण प्रति सेकंड कई हज़ार आईडी उत्पन्न कर सकते हैं, और आप अपने LAN / WAN पर कई उदाहरण चला सकते हैं;
  • स्काला में लिखा, जेवीएम पर चलाता है

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

  • सबसे महत्वपूर्ण 40 या बहुत बिट: एक टाइमस्टैम्प; आईडी का पीढ़ी का समय (हम टाइमस्टैम्प के लिए सबसे महत्वपूर्ण बिट्स का प्रयोग पीढ़ी के समय से आईडी-सपोर्ट करने के लिए कर रहे हैं।)

  • अगले 14 या इतनी बिट्स: एक प्रति-जनरेटर काउंटर, जो प्रत्येक जनरेटर प्रत्येक नए आईडी के लिए एक के द्वारा बढ़ाता है। यह सुनिश्चित करता है कि एक ही समय (उसी टाइमस्टैम्प) पर उत्पन्न आईडी अतिव्यापी नहीं होती हैं।

  • पिछले 10 या बहुत बिट: प्रत्येक जनरेटर के लिए एक अनन्य मान इसका प्रयोग करके, हमें जनरेटर के बीच किसी भी सिंक्रनाइज़ेशन (जो कि बहुत मुश्किल है) करने की ज़रूरत नहीं है, क्योंकि सभी मानकों ने इस मूल्य के कारण गैर-अतिव्यापी आईडी का उत्पादन किया है।

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

  • सबसे महत्वपूर्ण 32 बिट: टाइमस्टैम्प, आईडी का पीढ़ी का समय
  • कम से कम 32 बिट्स: 32-बिट यादृच्छिकता, प्रत्येक आईडी के लिए नवीनीकरण।

डी) आसान तरीका है, UUIDs / GUIDs का उपयोग करें ।

आपके पास प्रत्येक नोड का एक अनन्य आईडी हो सकता है (जो आपके पास वैसे भी हो) और उसके बाद अनुक्रम संख्या में शामिल हो

उदाहरण के लिए, नोड 1 अनुक्रम 001-00001 001-00002 001-00003 आदि उत्पन्न करता है और नोड 5 005-00001 005-00002 उत्पन्न करता है

अद्वितीय 🙂

वैकल्पिक रूप से यदि आप कुछ प्रकार के केंद्रीकृत सिस्टम चाहते हैं, तो आप अपने अनुक्रम सर्वर को ब्लॉकों में दिखा सकते हैं। यह ओवरहेड काफी कम कर देता है उदाहरण के लिए, प्रत्येक आईडी के लिए केंद्रीय सर्वर से एक नया आईडी का अनुरोध करने के बजाय, जिसे आपको असाइन किया जाना चाहिए, आप केंद्रीय सर्वर से 10,000 के ब्लॉक में आईडी का अनुरोध करते हैं और फिर केवल जब आप आउट होते हैं तो किसी अन्य नेटवर्क का अनुरोध करना होगा।

अब अधिक विकल्प हैं

तू यह प्रश्न "पुराना" है, मैं यहां आया हूं, इसलिए मुझे लगता है कि ये विकल्पों को छोड़ने के लिए उपयोगी हो सकता है (अब तक):

  • आप हेज़लकास्ट की कोशिश कर सकते हैं इसमें 1.9 रिलीज में इसे java.util.concurrent.AtomicLong का एक वितरित कार्यान्वयन शामिल है
  • आप ज़ूकिपर का उपयोग भी कर सकते हैं यह अनुक्रम नोड्स बनाने के तरीकों को प्रदान करता है (znode नामों में जोड़ा गया है, मैं नोड्स के संस्करण संख्याओं का उपयोग करना पसंद करता हूं)। इस एक के साथ सावधान रहें: यदि आप अपने अनुक्रम में छूटी हुई संख्या नहीं चाहते हैं, तो हो सकता है कि आप क्या चाहते हों।

चियर्स

यदि यह वास्तव में विश्व स्तर पर अनुक्रमिक होना है, और केवल अनन्य नहीं है, तो मैं इन नंबरों को वितरित करने के लिए एक एकल, सरल सेवा बनाने पर विचार करेगा।

वितरित किए गए सिस्टम बहुत से छोटी सेवाओं पर बातचीत करते हैं, और इस सरल कार्य के लिए, क्या आपको वास्तव में जरूरत है या क्या आप वास्तव में किसी अन्य जटिल, वितरित समाधान से लाभान्वित होंगे?

यह रेडिसीन के साथ किया जा सकता है यह AtomicLong का वितरित और स्केलेबल संस्करण लागू करता है यहां उदाहरण दिया गया है:

 Config config = new Config(); config.addAddress("some.server.com:8291"); Redisson redisson = Redisson.create(config); RAtomicLong atomicLong = redisson.getAtomicLong("anyAtomicLong"); atomicLong.incrementAndGet(); 

कुछ रणनीतियों हैं; लेकिन मुझे पता है कि कोई भी वास्तव में वितरित नहीं किया जा सकता है और एक वास्तविक अनुक्रम दे।

  1. एक केंद्रीय संख्या जनरेटर है यह एक बड़ा डेटाबेस नहीं है memcached में एक तेज परमाणु काउंटर होता है, अधिकांश मामलों में यह आपके संपूर्ण क्लस्टर के लिए तेज़ है
  2. प्रत्येक नोड के लिए एक पूर्णांक सीमा अलग (जैसे स्टीवन स्कल्न्स्टर का जवाब )
  3. यादृच्छिक संख्या या यूयूआईडी का उपयोग करें
  4. डेटा के कुछ टुकड़े का उपयोग करें, नोड की आईडी के साथ, और यह सब हैश (या एचएमएसी )

व्यक्तिगत रूप से, मैं UUIDs पर निर्भर हूँ, या मेम्कैच अगर मुझे अधिकांशतः सिकुड़ने वाला स्थान होना है

यूआईआईडी जेनरेटर (धागा सुरक्षित) का उपयोग क्यों नहीं करते?

मुझे इस पर विस्तार करना चाहिए

यूयूआईडी को विश्व स्तर पर अद्वितीय होने की गारंटी है (यदि आप यादृच्छिक संख्या के आधार पर उन लोगों से बचते हैं, जहां विशिष्टता केवल बेहद संभव है)।

प्रत्येक यूयूआईडी की वैश्विक विशिष्टता द्वारा आप कितने UUID जनरेटर का उपयोग करते हैं, इसके बावजूद आपकी "वितरित" आवश्यकता पूरी होती है।

आपके "थ्रेड सुरक्षित" आवश्यकता को "थ्रेड सुरक्षित" यूयूआईडी जेनरेटर चुनकर पूरा किया जा सकता है।

आपकी "अनुक्रम संख्या" आवश्यकता को प्रत्येक यूयूआईडी की गारंटी वाली वैश्विक विशिष्टता से पूरा किया जाता है।

ध्यान दें कि कई डेटाबेस अनुक्रम संख्या कार्यान्वयन (जैसे ओरेकल) किसी भी मौद्रिक रूप से बढ़ती या (यहां तक ​​कि) अनुक्रम संख्याओं (एक "प्रति कनेक्शन" आधार पर) की गारंटी नहीं देता है। ऐसा इसलिए है क्योंकि अनुक्रम संख्याओं का एक लगातार बैच को "कैश्ड" ब्लॉकों में प्रति कनेक्शन आधार पर आवंटित किया जाता है। यह वैश्विक विशिष्टता की गारंटी देता है और पर्याप्त गति रखता है लेकिन अनुक्रम संख्या वास्तव में आवंटित (समय के साथ) जब कई कनेक्शनों द्वारा आवंटित किया जा रहा है तो गड़बड़ हो सकता है!

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

मैंने एक सरल सेवा लिखा है जो अर्द्ध-अद्वितीय गैर अनुक्रमिक 64 बिट लंबी संख्या उत्पन्न कर सकती है। यह अतिरेक और स्केलेबिलिटी के लिए कई मशीनों पर तैनात किया जा सकता है। यह मैसेजिंग के लिए ज़ीरोएमक्यू का उपयोग करता है गिटब पेज को कैसे काम करता है इसके बारे में अधिक जानकारी के लिए: zUID

एक डेटाबेस का उपयोग करके आप एक कोर के साथ प्रति सेकंड 1.000 + वेतन वृद्धि तक पहुंच सकते हैं। यह बहुत आसान है आप उस नंबर को उत्पन्न करने के लिए बैकएंड के रूप में अपने डेटाबेस का उपयोग कर सकते हैं (जैसा कि डीडीडी शर्तों में इसकी अपनी कुल होना चाहिए)।

मुझे लगता है कि एक समान समस्या क्या है। मेरे पास कई विभाजन थे और मैं हर एक के लिए ऑफसेट काउंटर प्राप्त करना चाहता था। मैंने इस तरह कुछ कार्यान्वित किया:

 CREATE DATABASE example; USE example; CREATE TABLE offsets (partition INTEGER, offset LONG, PRIMARY KEY (partition)); INSERT offsets VALUES (1,0); 

फिर निम्नलिखित कथन निष्पादित:

 SELECT @offset := offset from offsets WHERE partition=1 FOR UPDATE; UPDATE offsets set offset=@offset+1 WHERE partition=1; 

यदि आपका एप्लिकेशन आपको अनुमति देता है, तो आप एक बार एक ब्लॉक आवंटित कर सकते हैं (यह मेरा मामला था)।

 SELECT @offset := offset from offsets WHERE partition=1 FOR UPDATE; UPDATE offsets set offset=@offset+100 WHERE partition=1; 

अगर आपको और थ्रूपूट की आवश्यकता है तो आप ऑफसेट को पहले से आवंटित नहीं कर सकते हैं, तो आप वास्तविक समय प्रसंस्करण के लिए फ्लिच का उपयोग कर अपनी खुद की सेवा को लागू कर सकते हैं। मैं प्रति विभाजन लगभग 100K वेतन वृद्धि प्राप्त करने में सक्षम था।

आशा करता हूँ की ये काम करेगा!

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

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