ऑफ़लाइन प्रणाली के साथ सिंक्रनाइज़ेशन


9

मैं एक ऐसी प्रणाली तैयार कर रहा हूं जिससे मैं मोबाइल डिवाइस (जो कि एक एम्बेडेड एप्लिकेशन है) से व्यावसायिक डेटा को सिंक्रनाइज़ करेगा जो डेटा उत्पन्न करता है और इसे सर्वर पर वापस भेजता है। प्रत्येक पंक्ति सिंक्रनाइज़ डेटाबेस में एक विशिष्ट व्यापार लॉग उत्पन्न करता है।

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

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

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

सिंक्रनाइज़ किए गए डेटा की मात्रा बड़ी होने की उम्मीद नहीं है, न ही सिंक्रनाइज़ेशन प्रक्रिया।

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

मैं जानना चाहता हूँ :

  1. अगर इस तरह से समझ में आता है? जब तक सिंक्रनाइज़ेशन प्रक्रिया का वॉल्यूम और समय अभी भी स्वीकार्य है।
  2. एक सामान्य तरीके से, मुझे किन अवधारणाओं को देखना चाहिए। बोनस: यदि स्प्रिंग मॉड्यूल में इन अवधारणाओं का कोई कार्यान्वयन है।

ऑफ़लाइन का क्या कारण है? मेरा मतलब है कि जब डिवाइस ऑफ़लाइन है तो इसका मतलब है कि सर्वर तक इसकी कोई पहुंच नहीं है या यह इंटरनेट पर भी नहीं है?
Laiv

यह इंटरनेट तक पहुँच नहीं है। या अक्सर नहीं।
वालफ्रैट

यदि आपके पास कई क्लाइंट / सर्वर सिंक्रोनाइज़ कर रहे हैं, तो आपको कुछ अलग होने की स्थिति में पहले डेटा मास्टर्सशिप पर निर्णय लेना होगा । यदि आप केवल और कई क्लाइंट्स के रुक-रुक कर कनेक्शन पर विचार करते हैं, तो निश्चित रूप से ऐसा करने का कोई तरीका नहीं है।
टॉफ्रो

@tofro डेटा मास्टर्सशिप मेरे मामले में निर्धारित करना आसान है, इसलिए यह कोई समस्या नहीं है। हालाँकि यह संभव क्यों नहीं होगा कि यह रुक-रुक कर कनेक्शन के साथ बढ़े? क्या मुझे केवल अंतिम सिंक तिथि का उपयोग करने में सक्षम नहीं होना चाहिए? इस तरह की तारीख का उपयोग करते हुए मेरे मामले में एकमात्र समस्या यह होगी कि यह कैसे पता चलेगा कि मेरे डिवाइस पर वर्तमान में डेटा स्थानांतरित कर दिया गया है और इसे डिवाइस पर हटा दिया जाना चाहिए।
वालफ्रैट

आपके विवरण से, मैं समझ गया हूं कि सर्वर पर एक ही डेटा आइटम को बदला जा सकता है, या एक या अधिक क्लाइंट्स पर। आप एक डेटा आइटम को तीन-तरह से सिंक कैसे करेंगे जो # 1 मोबाइल पर गया था, फिर सर्वर पर बदल दिया गया, फिर मोबाइल # 2 में चला गया और वहां बदल दिया गया, फिर मोबाइल # 1 कनेक्ट (डिस्कनेक्ट किए गए मोबाइल # 2 के साथ)?
टॉफ्रो

जवाबों:


1

एक दृष्टिकोण है कि मैं अब थोड़ी देर के लिए जांच कर रहा हूं (कुछ सफलता के साथ) ग्राहक डेटा को सर्वर डेटा के साथ सिंक करने के लिए, तारीखों (जो अविश्वसनीय हो सकता है) या तुल्यकालिक अनुरोधों पर भरोसा किए बिना, JSON पैच (शायद POOO s ) का एक संयोजन है आपके मामले में) और इवेंट सोर्सिंग

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

इसलिए क्लाइंट के पास सभी डेटा और तारीख को सर्वर पर भेजने के बजाय, क्लाइंट एक ईवेंट भेजता है, साथ ही एक रिवीजन नंबर जो पिछली बार क्लाइंट को लगता है कि डेटा अपडेट किया गया है, से मेल खाता है। कुछ इस तरह:

Server.send("MODIFY FOO", 3);

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

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

आपका माइलेज अलग हो सकता है, लेकिन मुझे उम्मीद है कि इससे मदद मिलेगी।

संपादित करें: इस दृष्टिकोण के लिए एक और नाम, या इसका एक भिन्नता, संदेश कतारबद्धता कहा जाता है , जैसा कि इस संबंधित प्रश्न में वर्णित है ।


सिस्टम कुछ दिनों के लिए ऑफ़लाइन (सर्वर तक पहुंच नहीं) हो सकता है और घटना के घटने पर तारीख दर्ज करनी चाहिए, न कि जब घटना को सर्वर के साथ सिंक्रनाइज़ किया गया था। इसलिए मुझे खजूर का इस्तेमाल करना होगा। मेरे पास आशावादी के लिए एक संशोधन संख्या भी है, लेकिन उसी कारण से, 2 डिवाइस एक POJO के संस्करण X को डाउनलोड कर सकते हैं और जब वे बाद में सिंक करते हैं, तो प्रत्येक घटनाओं को एक संस्करण X + 1 और X + 2 उत्पन्न करना होगा। और उपकरण एक दूसरे के साथ संवाद नहीं कर सकते।
वालफ्रैट

इस उत्तर में संशोधन संख्या हमेशा सर्वर में उत्पन्न होती है, ग्राहक पुराने संशोधन संख्या भेजते हैं, इसे अन्य ग्राहकों के बारे में जानने की आवश्यकता नहीं है क्योंकि संशोधन वेतन वृद्धि इसकी जिम्मेदारी नहीं है। यह उत्तर संघर्ष समाधान का उल्लेख करने में विफल रहता है, जो प्रस्तावित समाधान का सबसे महत्वपूर्ण हिस्सा है।
19

0

पहले अंक डेटा को सिंक्रनाइज़ करने के तरीके के रूप में दिनांक का उपयोग कर रहा है। मुझे यकीन है कि मुझे आपके समाधान के सभी विवरण नहीं मिले, लेकिन मैं कहूंगा कि:

  1. क्या मोबाइलों पर तारीखें उत्पन्न होती हैं? इस मामले में, क्या आप सुनिश्चित हैं कि मोबाइल पर चलने वाला ऐप हमेशा सही तिथियों का उपयोग करेगा? दुर्भावनापूर्ण उपयोगकर्ता के बारे में क्या है जो कुछ हद तक अपने मोबाइल डिवाइस पर सिस्टम तिथि को बदलने में सक्षम है? विभिन्न टाइमज़ोन में उपयोगकर्ताओं के बारे में क्या? जैसा कि @ जेफ्री ने आपको बताया, हो सकता है कि उपकरणों पर उत्पन्न तारीखों पर भरोसा करना सबसे अच्छा तरीका न हो।

  2. अगर मुझे ठीक से समझ आ गया है, तो आप ऑप्टिमिस्टिक कंसीलर कंट्रोल का उपयोग करें । मुझे ऐसा कुछ भी दिखाई नहीं देता जो आपके दृष्टिकोण में आंतरिक रूप से गलत हो।

  3. यह प्रश्न वसंत में आशावादी लॉकिंग को लागू करने के बारे में है । हो सकता है कि आप इसमें कुछ प्रेरणा पा सकें।


मुझे उस दिनांक को रिकॉर्ड करना होगा जब कार्रवाई निष्पादित की गई थी, जैसे कि मैं मोबाइल की तारीख के साथ फंस गया हूं। मोबाइल की तारीख सिस्टम के साथ अक्सर रिस्पॉन्स होती है। केवल पंजीकृत वंचित सर्वर के साथ सिंक कर सकता है। सुरक्षा के लिए यह अब (X509 डिवाइस प्रमाणीकरण, ...) के लिए एक और चिंता का विषय है
वालफ्रैट

दिनांक को किसी अन्य डेटा फ़ील्ड के रूप में रिकॉर्ड किया जा सकता है, इसे सिंक्रनाइज़ेशन टोकन के रूप में व्यवहार करने की आवश्यकता नहीं है।
बसिलेव्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.