दो उपयोगकर्ताओं को एक ही उपयोगकर्ता नाम के साथ एक ही समय में पंजीकरण करने से कैसे रोकें?


11

हम पंजीकरण को क्रमबद्ध नहीं कर सकते हैं क्योंकि एक ही समय में लाखों उपयोगकर्ता पंजीकृत हैं। समानांतर पंजीकरण होने की आवश्यकता है।

मान लीजिए कि डेटाबेस में उपयोगकर्ता नाम 'user1' नहीं है। जब दो उपयोगकर्ता 'user1' के साथ एक ही समय में पंजीकरण करने का प्रयास करते हैं तो वह इसे स्वीकार कर लेगा। लेकिन यह बाद में समस्या पैदा करेगा। ऐसा नहीं होना चाहिए।

मैं एक तार्किक समाधान की तलाश में हूं। कुछ खास नहीं। बस इसे हल करने के लिए एक विचार है।


कार्यस्थल पर इसे पोस्ट करने के अपने पूर्व प्रयास में दिया गया स्पष्टीकरण , एक साक्षात्कार
gnat

4
यह एक वैध सॉफ्टवेयर वास्तुकला समस्या है। उस तरह की समस्या नहीं जो केवल एक अच्छा साक्षात्कार प्रश्न बनाती है और कुछ नहीं।
कार्ल बेज़ेलफेल्ट

7
एक ही समय में लाखों उपयोगकर्ता पंजीकरण कर रहे हैं? वास्तव में? यदि आपके पास एक ही समय में लाखों उपयोगकर्ता पंजीकृत हैं, तो आपके पास बड़ी समस्याएं हैं - जैसे कि पंजीकृत उपयोगकर्ताओं के अरबों को संभालना। और शायद पैसे खर्च करने वाले सर्वर के लिए जो इसे संभालते हैं।
gnasher729

2
@AddzyK यह भविष्य की एक काल्पनिक समस्या है जिसका आप तार्किक समाधान चाहते हैं? बहुत यकीन है कि यहाँ गुंजाइश से बाहर है।
पैपराज़ो

3
एक काल्पनिक जवाब है: किसी और को यह करने के लिए भुगतान करें कि पहले से ही जानता है कि क्या करना है। लाखों नए उपयोगकर्ताओं / सेकंड के साथ, आपके पास नकदी होगी।
whatsisname

जवाबों:


15

मान लीजिए कि डेटाबेस में उपयोगकर्ता नाम 'user1' नहीं है। जब दो उपयोगकर्ता 'user1' के साथ एक ही समय में पंजीकरण करने का प्रयास करते हैं तो वह इसे स्वीकार कर लेगा।

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

ऐसा होने से रोकने के लिए आपको डेटाबेस का उपयोग करने के लिए डेटाबेस लेनदेन का उपयोग करने में सक्षम होना चाहिए। अन्यथा, कोई भी एप्लिकेशन डेटाबेस डेटा में आक्रमणकारियों को बनाए रखने में सक्षम नहीं होगा।

स्केलिंग के संदर्भ में, डेटाबेस ने पहले से ही आपके लिए आवश्यक तकनीकों का आविष्कार किया था, जैसे लॉकिंग के विभिन्न तरीकों पर निर्भर करता है कि आपको किस तरह की निरंतरता की आवश्यकता है, कई डेटाबेस सर्वरों के लिए वितरित डेटाबेस, आदि।


क्या पंजीकरण को लॉक करना अन्य उपयोगकर्ताओं को एक ही समय में पंजीकरण करने से नहीं रोकता है?
Addzy K

2
+1, बस कुछ कठिन गणित चला, और यहां तक ​​कि फेसबुक केवल कुछ पंजीकरण प्रति सेकंड औसत। इसलिए डेटाबेस की अपनी बाधाओं पर निर्भर होना पर्याप्त होना चाहिए।
ग्रैंडमास्टरबी

2
@AddzyK: लॉकिंग केवल उस संक्षिप्त क्षण के लिए होती है जब डेटाबेस को बाधाओं को लागू करना चाहिए। हां, एक साथ पंजीकरण करने वाले अन्य उपयोगकर्ताओं को लाइन में इंतजार करना होगा, लेकिन यह इंतजार बहुत कम है, और शायद ही कभी भी होता है, यहां तक ​​कि सबसे बड़े सिस्टम पर भी।
रॉबर्ट हार्वे

1
@GrandmasterB औसत यहाँ पूरी कहानी नहीं बता सकता है। मैंने इस सवाल पर आधारित किया कि यह भारी पीक लोड को संभालने के लिए था- उदाहरण के लिए ऑस्ट्रेलियाई जनगणना सामान।
19-16 बजे डेडएमजी

@AddzyK यह कर सकता है। अनिवार्य रूप से, आप तालिका के केवल लॉकिंग भाग के साथ दूर हो सकते हैं । इससे निपटने के लिए कई योजनाएं हैं, जैसे कि gnasher729 का उत्तर, लेकिन मेरा मानना ​​है कि आपको एक ऑफ-द-शेल्फ वितरित डेटाबेस उत्पाद प्राप्त करने में सक्षम होना चाहिए जो आपके लिए इसे संभाल सकता है। यहां तक ​​कि अगर आपको अपनी आंशिक लॉकिंग योजना को रोल करना है, तो इसे संभालने के लिए बहुत सारे ज्ञात तरीके हैं, जैसे कि DHT।
डेडएमजी

7

इसका एक मानक समाधान है। पंजीकरण करने के लिए कई श्रमिक बनाएं। प्रत्येक अनुरोध में उपयोगकर्ता नाम के लिए एक हैश लागू होता है, और हैश निर्धारित करता है कि कौन से कार्यकर्ता अनुरोध को संसाधित करता है। इस तरह एक ही उपयोगकर्ता नाम के लिए दो अनुरोधों के लिए कोई संभव तरीका नहीं है समवर्ती रूप से संसाधित किया जा सकता है।

इस तरह के अनुरोधों के लिए एक वितरित कुंजी मान स्टोर जैसे कि सभी डेटाबेस के बजाय डेटा स्टोर के रूप में जोखिम पर विचार करें।


2

कोई समस्या है ?

दो उपयोगकर्ताओं को एक गैर अद्वितीय उपयोगकर्ता नाम के साथ अपना पंजीकरण समाप्त करने दें यदि उपयोगकर्ता नाम (और उपयोगकर्ता ईमेल नहीं) लॉगिन के लिए उपयोग किया जाता है।

यदि उपयोगकर्ता नाम प्रमाणीकरण के लिए उपयोग नहीं किया जाता है, तो आप युगल (उदाहरण के लिए टाइमस्टैम्प पर आधारित) को पहचानने और ध्वजांकित करने के लिए कुछ पृष्ठभूमि प्रक्रिया का उपयोग कर सकते हैं और उपयोगकर्ता को अगले लॉगऑन पर अपना उपयोगकर्ता नाम बदलने के लिए मजबूर कर सकते हैं

हाँ यह एक समस्या है

जैसा कि आप पूछ रहे हैं, मुझे लगता है कि उपयोगकर्ता नाम एक अद्वितीय आईडी माना जाता है। निम्नलिखित तरीकों का इस्तेमाल किया जा सकता है:

  1. इससे पहले: पंजीकरण प्रक्रिया में, एक कदम आगे बढ़ाएं जहां नए उपयोगकर्ता को अपने नाम की उपलब्धता की जांच करनी होगी। ऐसा करते समय, एक अस्थायी स्थिति और सत्र आईडी के साथ उपलब्ध खाते के नाम को फिर से संरक्षित करें जो पंजीकरण को पूरा करने की अनुमति देगा।
  2. समान समय: gnasher729 उत्तर का एक अधिक सामान्य और लचीला संस्करण , एक साधारण हैश फ़ंक्शन (जैसे प्रतीक तालिका के प्रबंधन के लिए उपयोग किए जाने वाले) का उपयोग करना होगा, आईडी को एक अद्वितीय पंजीकरण सर्वर i (i = h) (उपयोगकर्ता नाम) को असाइन करने के लिए। number_of_servers) जो अपने सीमित / खंडित दायरे पर विशिष्टता को संभालेंगे
  3. के बाद: पंजीकरण के अंत में, जब उपयोगकर्ता registerआपके लेन-देन डेटाबेस में अनुरोध भेजने पर क्लिक करता है, यदि आप फ़ील्ड को अद्वितीय के रूप में परिभाषित कर सकते हैं। त्रुटि होने पर, बदकिस्मत उपयोगकर्ता को भेजें "उफ़, एक समस्या थी" संदेश और उसे एक और आईडी चुनने के लिए कहें।
  4. एसिंक्रोनस: उपयोगकर्ता को पंजीकृत करें। यह सुनिश्चित करने के बाद कि यह अपरिवर्तित और एकल है, उपयोगकर्ता रिकॉर्ड को फिर से बनाएँ। यदि यह एक समस्या है, तो उपयोगकर्ता को बदलने के लिए कहें (इतना अतुल्यकालिक नहीं), या उसे एक मेल भेजें कि कोई समस्या थी (असिंक्रोनस, लेकिन उपयोगकर्ता के दृष्टिकोण से कष्टप्रद), या उसे पंजीकृत करें लेकिन उसे अपने ईमेल के लिए पूछें (अवहेलना करने के लिए) और उसे लॉगिन प्रक्रिया के भाग के रूप में उपयोगकर्ता नाम बदलने के लिए बाध्य करें।

1

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


0

एक ही समय में पंजीकरण करने वाले लाखों उपयोगकर्ताओं के साथ, आप 26 एक्स 26 पंजीकरण सर्वर का उपयोग करते हैं, एक एए के साथ शुरू होने वाले उपयोगकर्ताओं के लिए, एक एब के साथ शुरू होने वाले उपयोगकर्ताओं के लिए और इतने पर। नतीजतन, एक ही समय में प्रत्येक सर्वर पर हजारों उपयोगकर्ता पंजीकृत होते हैं। यदि आप अभी भी नहीं संभाल सकते हैं, तो 26 x 26 x 26 सर्वर का उपयोग करें।


5
... और फिर आपके उत्पाद का मालिक अंतरराष्ट्रीय स्तर पर जाना चाहता है ...
टेलस्टीन

2
जब तक वे NFKD जैसे सामान्यीकृत रूप में होते हैं, तब तक यूनिकोड स्ट्रिंग्स पर समान सिद्धांत लागू होते हैं। आप उपयोगकर्ता नाम को भी हैश कर सकते हैं और इसे हैश के आधार पर लागू कर सकते हैं। हालाँकि, यह उत्तर मूल रूप से केवल अपने स्वयं के वितरित डेटाबेस को लागू करने के लिए है।
डेडएमजी

1
आपका मतलब है कि एक देश में एक ही समय में उनके लाखों उपयोगकर्ता पंजीकृत हैं ? उस मामले में उनके पास वास्तविक समाधान के लिए अधिक भुगतान करने के लिए पर्याप्त धन होना चाहिए।
gnasher729

अधिक विशेष रूप से, यह सिर्फ शुरुआत है कि डीएचटी कैसे किया जाता है।
डेडएमजी

यह एक ही समय में एक ही नाम को पंजीकृत करने वाले दो उपयोगकर्ताओं की समस्या को कैसे ठीक करता है - दोनों नाम एक ही दो वर्णों के साथ शुरू होंगे और इसलिए एक ही पंजीकरण सर्वर द्वारा संभाला जाएगा?
HorusKol
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.