GAE

2010-10-04 12 views
6

में अनन्य बाधा लागू करना मैं Google App Engine Java को आजमा रहा हूं, हालांकि एक अद्वितीय बाधा की अनुपस्थिति चीजों को मुश्किल बना रही है। मैं through this post और this blog कुछ समान लागू करने के लिए एक विधि सुझाता हूं। मेरी पृष्ठभूमि MySQL में है। एक अनोखी बाधा के बिना डेटास्टोर को ले जाना मुझे चिड़चिड़ाहट देता है क्योंकि मुझे पहले कभी डुप्लिकेट मानों के बारे में चिंता करने की ज़रूरत नहीं थी और एक नया मान डालने से पहले प्रत्येक मान को जांचना अभी भी त्रुटि के लिए कमरा है।GAE

"नहीं, आप अभी भी स्कीमा निर्माण के दौरान अद्वितीय निर्दिष्ट नहीं कर सकते हैं।"

- David Underhill GAE और अद्वितीय बाधा (post link)

तुम लोगों के लिए एक अनूठा या प्राथमिक कुंजी के लिए कुछ इसी तरह लागू करने के लिए प्रयोग कर रहे हैं क्या के बारे में बातचीत?

मैं एक अमूर्त डेटासंग्रह परत निम्न स्तर एपीआई जो एक नियमित रूप से RDB, जो हालांकि मुक्त नहीं था (हालांकि मैं सॉफ्टवेयर का नाम याद नहीं है)

की योजनाबद्ध दृश्य की तरह काम किया उपयोग कर बनाई गई के बारे में सुना मेरी समस्या

sNo = biggest serial_number in the db 
sNo++ 
Insert new entry with sNo as serial_number value //checkpoint 
User adds data pertaining to current serial_number 
Update entry with data where serial_number is sNo 

हालांकि लाइन नंबर 3 (चेकपॉइंट) पर, मुझे लगता है कि दो उपयोगकर्ता एक ही एसएनओ जोड़ सकते हैं। और यही वह है जो मुझे एपेंगेन के साथ काम करने से रोक रहा है।

उत्तर

4

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

हालांकि, यह दृष्टिकोण संभावित प्रदर्शन चॉकपॉइंट होगा और आपके एप्लिकेशन की स्केलेबिलिटी को सीमित करेगा। यदि ऐसा है कि नए सीरियल नंबरों का निर्माण अक्सर ऐसा नहीं होता है कि आपको विवाद मिलता है, तो यह आपके लिए काम कर सकता है।

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

मैं जावा में अच्छी तरह से नमूना कोड प्रदान करने के लिए पर्याप्त है, और मेरी अजगर उदाहरण याद नहीं आप के लिए अर्थहीन हो सकता है, लेकिन यहां छद्म कोड है विचार वर्णन करने के लिए:

  1. एक नई सूची बनाने के लिए अनुरोध प्राप्त करें आइटम।
  2. लेनदेन दर्ज करें।
  3. सीरियल नम्बर मॉडल की एकल इकाई के वर्तमान मूल्य को पुनर्प्राप्त करें।
  4. वृद्धि मूल्य और इसे
  5. पर वापस लौटें जब आप लेनदेन से बाहर निकलेंगे तो वापसी मूल्य।

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

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

+0

क्या सिंगलटन इकाई पर लेनदेन की आवश्यकता नहीं होगी कि सिंगलटन और सभी संबंधित इकाइयां एक ही इकाई समूह में हों? –

+0

@ जेसन, मुझे लगता है कि सिंगलटन को अपने समूह में अलग किया जा सकता है। सीरियल नंबर प्राप्त करने वाली संस्थाएं इससे संबंधित नहीं हैं। लेनदेन के अलगाव में होने वाली एकमात्र चीज सीरियल नंबर में बढ़ोतरी है। मैं खुशी से एक उदाहरण कोड करूँगा, लेकिन मैं पायथन के साथ प्रोग्राम AppEngine प्रोग्राम। 1 999 से जावा को छुआ नहीं है। –

+0

@ जेसन हॉल @ एडम क्रॉसलैंड मुझे आपको यह बताने चाहिए कि आपने जो कुछ कहा वह मेरे सिर के ऊपर 'वाह' चला गया। मेरे पास कोई 'लेनदेन' अनुभव नहीं है, मैं जावा के लिए नया हूं, लेकिन मैं छद्म कोड का थोड़ा सा समझता हूं, जो कि मैं वर्तमान में जो करता हूं उसके समान है। यह कम यातायात परिदृश्य में काम करेगा, लेकिन मैं भी खराब परिदृश्यों में अपेक्षाकृत निश्चित होना चाहता हूं। उत्कृष्ट लेखन के लिए धन्यवाद! – abel

12

पारंपरिक आरडीबी से ऐप इंजन की तरह बिगटेबल जैसी डाटास्टोर में संक्रमण के बारे में बात करते समय यह और अन्य समान प्रश्न अक्सर आते हैं।

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

आपके प्रश्न का उत्तर वास्तव में सोचता है कि आपको उस अद्वितीय बाधा की आवश्यकता क्यों है।

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

my_user = MyUser(key_name=users.get_current_user().email()) 
my_user.put() 

यह गारंटी है कि कोई MyUser कभी उस ईमेल के साथ कभी भी फिर से बनाया जाएगा, और आप भी जल्दी से उस ईमेल के साथ MyUser प्राप्त कर सकते हैं:

my_user = MyUser.get(users.get_current_user().email()) 

अजगर क्रम आप भी कर सकते हैं :

my_user = MyUser.get_or_create(key_name=users.get_current_user().email()) 

जो उस ईमेल के साथ उपयोगकर्ता को सम्मिलित या पुनर्प्राप्त करेगा।

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

+0

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

+2

+1। उत्कृष्ट जवाब! –

+1

@abel आदर्श रूप से आपके सिस्टम को monotonically बढ़ती धारावाहिक संख्या की आवश्यकता नहीं होगी और आप प्रत्येक आइटम के लिए एक यादृच्छिक कुंजी असाइन कर सकते हैं। यदि यह किसी अन्य सिस्टम के साथ बातचीत करना है, तो यह आसानी से करने योग्य नहीं हो सकता है। आप निष्पादन के लिए परमाणुता और memcache के लिए लेनदेन का उपयोग करने का प्रयास कर सकते हैं। –

3

मुझे इस एप्लिकेशन में एक ही समस्या का सामना करना पड़ा जहां उपयोगकर्ताओं को टाइमलॉट आरक्षित करने की आवश्यकता थी। उपयोगकर्ताओं को एक साथ एक ही समय के लिए अनुरोध करने की उम्मीद करते समय मुझे एक अद्वितीय टाइमलॉट इकाई "डालने" की आवश्यकता थी।

मैंने ऐप इंजन पर ऐसा करने का उदाहरण दिया है, और मैं blogged about it। ब्लॉग पोस्टिंग में डेटास्टोर का उपयोग करके कैनोलिक कोड उदाहरण हैं, और ऑब्जेक्टिफाइज़ भी हैं। (बीटीडब्ल्यू, मैं जेडीओ से बचने की सलाह दूंगा।)

मैंने live demonstration भी तैनात किया है जहां आप दो उपयोगकर्ताओं को एक ही संसाधन को आरक्षित करने के लिए अग्रिम कर सकते हैं। इस डेमो में आप क्लिक करके ऐप इंजन डेटास्टोर के सटीक व्यवहार का अनुभव कर सकते हैं।

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

-broc

0

मैं पहली बार में broc के ब्लॉग में लेन-देन तकनीक के लिए एक विकल्प सोचा, एक सिंगलटन वर्ग जो एक तुल्यकालन विधि शामिल (माना addUserName (स्ट्रिंग नाम)) जिम्मेदार केवल तभी एक नई प्रविष्टि जोड़ने बनाने के लिए किया जा सकता है यह अद्वितीय है या अपवाद फेंक रहा है। फिर एक contextlistener बनाएं जो इस सिंगलटन के एक उदाहरण को तुरंत चालू करता है, इसे servletContext में एक विशेषता के रूप में जोड़ता है। Servlets तब addSserName() विधि को सिंगलटन इंस्टेंस पर कॉल कर सकते हैं जिसे वे getServletContext के माध्यम से प्राप्त करते हैं।

हालांकि यह एक अच्छा विचार नहीं है क्योंकि जीएई कई जेवीएम में ऐप को विभाजित करने की संभावना है, इसलिए कई सिंगलटन क्लास इंस्टेंस अभी भी हो सकते हैं, प्रत्येक JVM में से एक। see this thread

विकल्प की तरह एक और जीएई विशिष्टता की जांच करने और नई प्रविष्टियों को जोड़ने के लिए जिम्मेदार जीएई मॉड्यूल लिखना होगा; तो साथ ...

<max-instances>1</max-instances> 

तो फिर तुम जो अधिकार का एक बिंदु के रूप में कार्य, डेटा स्टोर करने के लिए एक समय में उन जोड़ने GAE पर चल रहे एक उदाहरण मैनुअल या बुनियादी स्केलिंग का उपयोग करें। यदि आप इस उदाहरण के बारे में चिंतित हैं तो आप एक मॉडलिंग में सुधार कर सकते हैं, क्यूइंग या आंतरिक मास्टर/गुलाम वास्तुकला जोड़ सकते हैं।

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