क्या GAE पर कार्य पंक्तियों के साथ FIFO (पहले, पहले बाहर) व्यवहार को आश्वस्त करने का कोई तरीका है?क्या GAE पर कार्य पंक्तियों के साथ FIFO (पहले, पहले बाहर) व्यवहार को आश्वस्त करने का कोई तरीका है?
जीएई दस्तावेज़ीकरण का कहना है कि फीफो उन कारकों में से एक है जो कार्य निष्पादन आदेश को प्रभावित करते हैं, लेकिन एक ही दस्तावेज कहता है कि "सिस्टम का शेड्यूलिंग कतार के सिर पर नए कार्यों को 'कूद' सकता है और मैंने इस व्यवहार की पुष्टि की है एक परीक्षा। प्रभाव: मेरी घटनाओं को क्रम से संसाधित किया जा रहा है।
डॉक्स का कहना है:
https://developers.google.com/appengine/docs/java/taskqueue/overview-push
जिस क्रम में कार्य क्रियान्वित कर रहे हैं निर्भर करता है कई कारकों पर:
कतार में कार्य की स्थिति। ऐप इंजन फीफो> (पहले, पहले आउट) ऑर्डर के आधार पर कार्यों को संसाधित करने का प्रयास करता है। सामान्य रूप से, कतार के अंत में कार्य को सम्मिलित किया जाता है, और कतार के सिर से निष्पादित किया जाता है।
कतार में कार्यों का बैकलॉग। सिस्टम किसी भी दिए गए कार्य के लिए शेड्यूलर को विशेष रूप से अनुकूलित सूचनाओं के माध्यम से सबसे कम विलंबता प्रदान करने का प्रयास करता है। इस प्रकार, यदि किसी कतार में कार्यों का एक बड़ा बैकलॉग है, सिस्टम का शेड्यूलिंग कतार के शीर्ष पर नए कार्यों को "कूद" सकता है।
कार्य की ईटामिलिस संपत्ति का मूल्य। यह गुण निर्दिष्ट करता है कि कोई कार्य निष्पादित हो सके। पुश कार्यों को संसाधित करने के लिए निर्दिष्ट ईटीए के बाद ऐप इंजन हमेशा तक प्रतीक्षा करता है।
कार्य की उलटी गिनती Millis संपत्ति का मूल्य। यह कार्य किसी कार्य को निष्पादित करने से पहले प्रतीक्षा करने के लिए न्यूनतम सेकंड की संख्या निर्दिष्ट करता है। उलटी गिनती और ईटा पारस्परिक रूप से अनन्य हैं; यदि आप एक निर्दिष्ट करते हैं, तो दूसरे को निर्दिष्ट न करें।
मुझे क्या करना है? मेरे उपयोग के मामले में, मैं वाहनों से आने वाले 1-2 मिलियन कार्यक्रम/दिन संसाधित करूंगा। इन घटनाओं को किसी भी अंतराल (1 सेकंड, 1 मिनट या 1 घंटा) पर भेजा जा सकता है। घटना प्रसंस्करण के आदेश को आश्वस्त किया जाना चाहिए। मुझे टाइमस्टैम्प ऑर्डर द्वारा प्रक्रिया की आवश्यकता है, जो वाहन के अंदर एक एम्बेडेड डिवाइस पर उत्पन्न होता है।
मेरे पास अब क्या है?
एक रेस्ट सर्वलेट जिसे उपभोक्ता द्वारा बुलाया जाता है और एक कार्य बनाता है (ईवेंट डेटा पेलोड पर है)।
इस के बाद, एक कार्यकर्ता सर्वलेट इस कार्य हो और:
deserialize ईवेंट डेटा;
डेटास्टोर पर ईवेंट डालें;
डेटास्टोर पर वाहन अपडेट करें।
तो, फिर से, वहाँ किसी भी तरह से सिर्फ फीफो व्यवहार को आश्वस्त करने के लिए है? या यह पाने के लिए मैं इस समाधान को कैसे सुधार सकता हूं?
आपको सख्त फीफो की आवश्यकता क्यों है? याद रखें कि ऑर्डर-ऑफ-इवेंट्स एक वितरित प्रणाली में अस्पष्ट है - यहां तक कि यह बताते हुए कि कई लगभग एक साथ अनुरोध किए गए पहले मुश्किल (और अक्सर व्यर्थ) होते हैं जब आपके फ्रंटेंड और बैकएंड कई मशीनों में वितरित किए जाते हैं। अंत परिणाम के रूप में, आप क्या हासिल करने की कोशिश कर रहे हैं? –
हम सार्वजनिक बसों को ट्रैक करते हैं, इसलिए हमें यह जानना होगा कि यह बस स्टॉप में कब रुक गया था, या जब यह एक यात्रा खोला गया था, या जब यह वेग सीमा से अधिक हो गया था। समस्या यह है कि कुछ घटनाएं पिछले कार्यक्रमों से संबंधित हैं क्योंकि हम राज्य प्रबंधन भी करते हैं। उदाहरण के लिए: यदि कोई पिछली घटना में 'बंद यात्रा' दर्ज की जाती है तो बस केवल 'एक यात्रा खोल सकती है'। तो, आप कल्पना कर सकते हैं कि क्या हो सकता है यदि मुझे इन घटनाओं को क्रम से बाहर निकाला जा सके ... –
किसी कार्य कतार किसी भी मामले में ऐसा करने का सबसे अच्छा तरीका नहीं है। आप क्या करना चाहते हैं डेटास्टोर लेनदेन का उपयोग करें, और किसी दिए गए बस के लिए राज्य संक्रमणों के सेट को केवल उन लोगों तक सीमित करें जिन्हें आपकी राज्य मशीन द्वारा अनुमति दी गई है। –