2013-04-28 4 views
5

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

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

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

+1

चूंकि ब्लॉब्स को संशोधित नहीं किया जा सकता है, इसलिए प्रतिलिपि क्यों बनाते हैं? उपयोगकर्ता 2 के लिए एक ही ब्लॉब का बस एक और संदर्भ है।यदि उपयोगकर्ताओं को ब्लॉब की सामग्री को हटाने की अनुमति है, तो वास्तव में ब्लॉबस्टोर से इसे हटाने से पहले संदर्भ काउंटर की जांच करें। –

+0

हमने इसके बारे में सोचा लेकिन बहुत तेज गिरा दिया क्योंकि उपयोगकर्ता हटा सकते हैं। एक ब्लॉब के लालित्य और प्रतिलिपि के दर्द को देखते हुए, यह एक और रूप के लायक है। इसे मॉडल करने का सबसे अच्छा तरीका क्या होगा? एक ब्लॉब में एक से अधिक संदर्भ हैं या नहीं, यह ट्रैक करने के लिए एक क्रॉस-रेफरेंस इकाई - क्रॉस संदर्भ इकाई में एक प्रविष्टि बनाएं जब ब्लॉब 'प्रतिलिपि' हो और प्रत्येक बार जब 'कॉपी' या 'हटाया गया' हो तो काउंटर या आईडी को जोड़ें/घटाएं केवल एक संदर्भ है। हमने काउंटर और डेटा स्टोर के साथ हमारी चुनौतियों का सामना किया है, इसलिए वास्तव में यह एक अंतिम संदर्भ है जब यह केवल एक अंतिम संदर्भ है। – coleMan

+0

कुछ बहस के बाद, हमने कलले के सुझाव के एक संस्करण के साथ जाने का फैसला किया है। अगर यह दूसरों की मदद करेगा तो नीचे जवाब दें। साथ ही, पिछली बार हमने सोचा कि हमारे पास कोड कार्यान्वयन प्रश्न था, लेकिन यह एक वास्तुशिल्प प्रश्न साबित हुआ जो शायद प्रोग्रामर्स स्टैक एक्सचेंज के लिए बेहतर अनुकूल है। – coleMan

उत्तर

1

हमने फ़ाइल एपीआई के साथ ब्लॉब की प्रोग्रामेटिक प्रतिलिपि बनाने के विचार को समाप्त कर दिया और कलले ने अपनी टिप्पणी में सुझाव दिया, और एक नई xref इकाई बनाई जो प्रतिलिपि और मूल के बारे में जानकारी संग्रहीत करता है। जब कोई छवि या फ़ाइल हटा दी जाती है, तो हम संदर्भों के लिए xfef इकाई की जांच करते हैं और उस छवि/फ़ाइल को इंगित करने वाले लोगों को हटाते हैं (यानी हटाया गया है कि हटाई गई छवि/फ़ाइल किसी अन्य से कॉपी की गई थी)। अगर हमें कोई भी xrefs नहीं मिलता है, तो हम ब्लॉब को ही हटा देते हैं। हमें अनाथ ब्लाब्स को चारों ओर बिछाने के निजता/अनुपालन के प्रभाव पसंद नहीं आया, और भले ही भंडारण सस्ता है हर $$$ मदद करता है। हमें एक साफ घर रखने के विचार को भी पसंद आया।

0

समाधान 1: मैं एक Google कंप्यूट इंजन उदाहरण लॉन्च करूंगा और कॉपी करने के लिए gsutil कमांड का उपयोग करूंगा।

और फिर यह पूरा होने पर इंस्टेंस को बंद करें। यह मेरी जानकारी के लिए प्रतिलिपि करने के लिए सबसे तेज़ तरीका है

gsutil documentation

समाधान 2: लेकिन मैं व्यक्तिगत रूप से, के रूप में टिप्पणी में कहा एक काउंटर का उपयोग करने का चयन करेंगे क्योंकि मुद्दा यह है कि आप ने कहा डरावना इच्छा है प्रतिलिपि के साथ एक ही समस्या हो। तो उदाहरण के लिए उन पर मजबूत इकाई परीक्षण वाले काउंटर का उपयोग करें जो कम डरावना होगा।

इसे कम डरावना बनाने का विचार यह है कि जब आप अपने काउंटर के लिए 0 तक पहुंचते हैं तो आप तुरंत ब्लॉब को नहीं हटाते हैं लेकिन बाद में ऐसा करने के लिए नौकरी करते हैं। Google App Engine में Scheduled task का उपयोग करके। और उदाहरण के लिए एक महीने बाद फ़ाइल और इसके वास्तविक रिकॉर्ड को हटा दें।

0

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

संबंधित मुद्दे