कृपया मेरी गलतफहमी खोजने में मेरी सहायता करें।ऐप इंजन, लेनदेन, और idempotency
मैं ऐप इंजन पर एक आरपीजी लिख रहा हूं। कुछ निश्चित कार्यकर्ता एक निश्चित स्थिति का उपभोग करते हैं। यदि स्थिति शून्य तक पहुंच जाती है तो खिलाड़ी कोई और कार्रवाई नहीं कर सकता है। मैंने खिलाड़ियों को धोखा देने के बारे में चिंता करना शुरू किया, हालांकि - क्या होगा यदि एक खिलाड़ी ने दो कार्यों को बहुत जल्दी भेजा, तो एक दूसरे के बगल में? यदि कोड को कम करने वाला कोड लेनदेन में नहीं है, तो खिलाड़ी को दो बार कार्रवाई करने का मौका मिलता है। तो, मुझे कोड को लपेटना चाहिए जो लेनदेन में स्टेट को कम करता है, है ना? अब तक सब ठीक है.
GAE अजगर में, हालांकि, हम इस documentation में है:
नोट: जब एक सौदा प्रस्तुत करने अपने अनुप्रयोग एक अपवाद प्राप्त करता है, यह नहीं हमेशा मतलब है कि लेन-देन में विफल रहा है। आप टाइमआउट, ट्रांज़ेक्शनफेल एरर, या लेनदेन किए गए मामलों में आंतरिक त्रुटि अपवाद प्राप्त कर सकते हैं और अंत में सफलतापूर्वक लागू किया जाएगा। जब भी संभव हो, अपने डेटास्टोर लेन-देन को बनाएं कि यदि आप एक लेनदेन दोहराते हैं, तो अंतिम परिणाम वही होगा।
हूप्स। इसका मतलब है कि समारोह मुझे लगता है कि चल रहा था इस तरह दिखता है कि:
def decrement(player_key, value=5):
player = Player.get(player_key)
player.stat -= value
player.put()
ठीक है, कि नहीं करने वाला काम है, सही है क्योंकि बात idempotent नहीं है? अगर मैं इसके चारों ओर एक लेट्री लूप डालता हूं (क्या मुझे पायथन में आवश्यकता है? मैंने पढ़ा है कि मुझे SO पर आवश्यकता नहीं है ... लेकिन मुझे इसे दस्तावेज़ों में नहीं मिल रहा है) यह मूल्य को दो बार बढ़ा सकता है, सही? चूंकि मेरा कोड अपवाद पकड़ सकता है लेकिन डेटास्टोर ने अभी भी डेटा किया है ... हुह? मैं यह कैसे तय करुं? क्या यह एक मामला है जहां मुझे distributed transactions की आवश्यकता है? क्या मैं वास्तव में
ठीक है, हाँ, और यह एक अच्छा मुद्दा है ... लेकिन इससे पहले कि मैं अपने कोड को कठोर-से-निदान के समूह के साथ कूड़ा, हार्ड-टू- बग पुन: उत्पन्न करें मैं सीखना चाहता हूं कि मुझे किस पैटर्न के लिए जाना चाहिए। –
आपका पैटर्न सही रास्ते पर है, लेकिन जीएई में कुछ निराशाजनक बारीकियां हैं जो इस तरह के शल्य चिकित्सा के सटीक कार्यान्वयन को कठिन बनाती हैं। जीएई के साथ अपने अनुभव में, कभी-कभी यह प्रयास के लायक है, और कभी-कभी इसकी नहीं। –
@TravisWebb असहमत। लेनदेन संबंधी सुरक्षा 'समयपूर्व अनुकूलन' नहीं है, न ही लेनदेन टकराव विशेष रूप से असंभव है। –