मोबाइल एप्लिकेशन में डेटा सिंक्रनाइज़ेशन - कई डिवाइस, कई उपयोगकर्ता


42

मैं अपना पहला मोबाइल ऐप बनाने में लगा हूं। एप्लिकेशन की मुख्य विशेषताओं में से एक यह है कि कई उपकरणों / उपयोगकर्ताओं के पास समान डेटा तक पहुंच होगी - और उन सभी के पास CRUD अधिकार होंगे।

मेरा मानना ​​है कि आर्किटेक्चर में एक केंद्रीय सर्वर शामिल होना चाहिए जहां सभी डेटा संग्रहीत है। डिवाइस अपने डेटा ऑपरेशन करने के लिए सर्वर से बातचीत करने के लिए एक एपीआई का उपयोग करेंगे (जैसे एक रिकॉर्ड जोड़ना, एक रिकॉर्ड को संपादित करना, एक रिकॉर्ड हटाना)।

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

  1. उपयोगकर्ता A ऑफ़लाइन है और # 100 रिकॉर्ड करता है
  2. उपयोगकर्ता B ऑफ़लाइन है और # 100 रिकॉर्ड करता है
  3. उपयोगकर्ता C ऑफ़लाइन है और रिकॉर्ड # 100 हटाता है
  4. उपयोगकर्ता C ऑनलाइन जाता है (संभवतः, रिकॉर्ड # 100 सर्वर पर हटा दिया जाना चाहिए)
  5. उपयोगकर्ता A और B ऑनलाइन हो जाते हैं, लेकिन उनके द्वारा संपादित रिकॉर्ड अब मौजूद नहीं हैं

उपरोक्त के समान सभी प्रकार के परिदृश्य सामने आ सकते हैं।

यह आमतौर पर कैसे संभाला जाता है? मैं MySQL का उपयोग करने की योजना बना रहा हूं, लेकिन सोच रहा हूं कि क्या यह ऐसी समस्या के लिए उपयुक्त नहीं है।

जवाबों:


30

मैं वर्तमान में एक ही आवश्यकताओं और मुद्दों के साथ एक मोबाइल / डेस्कटॉप / वितरित ऐप पर काम कर रहा हूं।

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

आम तौर पर, यह सब उबलता है कि आपके पास एक संभावित डेटा रिकॉर्ड है जो n ग्राहकों को वितरित किया जाता है, जो इसे उसी समय संपादित कर सकते हैं। आपको क्या चाहिए

  1. एक उचित संस्करण नियंत्रण / लॉकिंग तंत्र,
  2. एक उचित अधिकार / पहुंच प्रबंधन,
  3. एक उचित सिंक्रनाइज़ेशन / कैशिंग रणनीति

(1) के लिए आप कुछ पैटर्न लागू कर सकते हैं: दो बार उपयोग की जाने वाली लॉकिंग रणनीतियाँ हैं: ऑप्टिमिस्टिक ऑफ़लाइन लॉकिंग और निराशावादी लॉकिंग । इनमें से कुछ अलग-अलग संस्करण नियंत्रण "पैटर्न" में लागू होते हैं, जैसे कि मल्टीवर्जन कॉन्सिक्वेंसी कंट्रोल ( एमवीसीसी ), जो प्रत्येक डेटा रिकॉर्ड के लिए एक काउंटर (एक बहुत ही सरल "टाइम स्टैम्प" की तरह) का उपयोग करता है, जिसे जब भी रिकॉर्ड बदला जाता है ।

(२) और (३) बहुत व्यापक मुद्दे हैं, जिन्हें स्वतंत्र रूप से (१) निपटाया जाना चाहिए। मेरे अनुभव से कुछ सलाह:

  • एक क्लाइंट-सर्वर तकनीक का उपयोग करें जो आपके लिए अधिकांश मुद्दों को दूर करती है। मैं CouchDb जैसी कुछ वेब तकनीक की अत्यधिक अनुशंसा करता हूं , जो (1) ऑप्टिमिस्टिक ऑफ़लाइन लॉकिंग + MVCC, (2) वेब एपीआई के माध्यम से, और (3) Http कैशिंग के माध्यम से बहुत अच्छी तरह से संभालती है।

  • यदि आप सिद्ध तकनीकों और दृष्टिकोणों पर भरोसा कर सकते हैं तो चीजों को स्वयं आविष्कार न करने का प्रयास करें। मेरा मानना ​​है कि मौजूदा प्रौद्योगिकियों / पैटर्न की तुलना में शोध और खर्च किए गए किसी भी घंटे को अपने स्वयं के सिस्टम को लागू करने की कोशिश करने की तुलना में बेहतर खर्च किया जाता है।

  • यदि संभव हो तो सजातीय प्रौद्योगिकियों का उपयोग करने का प्रयास करें। "सजातीय" से मेरा अभिप्राय उन प्रौद्योगिकियों से है, जो उन्हीं सिद्धांतों को ध्यान में रखकर बनाई गई हैं, जैसे वेब 2.0 उपयोग परिदृश्य। एक उदाहरण: स्थानीय कैशिंग रणनीति के साथ उचित काउचडब और रीस्ट क्लाइंट (वेब ​​एपीआई) का उपयोग करना मोबाइल एप्लिकेशन के लिए एसक्यूएल का उपयोग करने से बेहतर विकल्प है।

  • मैं MySQL के उपयोग के खिलाफ दृढ़ता से सलाह देता हूं क्योंकि यह एक ऐसी तकनीक है जो स्पष्ट रूप से ऐसे उपयोग परिदृश्यों के लिए नहीं बनाई गई थी। यह काम करता है, लेकिन आप एक डेटाबेस सिस्टम के साथ बहुत बेहतर हैं जो पहले से ही वेब संचार और संगामिति शैली (जैसे कई NoSQL डेटाबेस) को गले लगाता है।

वैसे, मैंने CouchDb के लिए एक कस्टम स्थानीय क्लाइंट के साथ काम किया है, जो CouchDb API के खिलाफ काम करता है, जो खूबसूरती से काम करता है। मैंने MSQL + (N) हाइबरनेट का उपयोग करने से स्विच किया और पहली जगह में सही विकल्प (पर्याप्त शोध नहीं करने का अर्थ) नहीं बनाने के लिए उच्च कीमत का भुगतान किया।


+1 ऑप्टिमिस्टिक बनाम निराशावादी लॉकिंग पहली चीज थी जो ओपी के पोस्ट को पढ़ते हुए मेरे सिर में आ गई थी

10

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

एक अच्छा प्रारंभिक बिंदु जिस पर आपको विचार करना चाहिए वह Apache CouchDB का उपयोग कर रहा है । यह स्कीमा-कम है, जो HTTP और JSON पर आधारित है, और इसकी बहुत अच्छी प्रतिकृति प्रणाली है। हम इसका उपयोग एक समान समस्या को हल करने के लिए करते हैं।

CouchDB की प्रतिकृति तंत्र उसी HTTP एपीआई का उपयोग करता है जिसे कोई अन्य क्लाइंट उपयोग करता है। तो संक्षेप में, यह एक एपीआई पर प्रतिकृति प्रदान करता है।

IOS के लिए, मैं काउचबेस लाइट प्रोजेक्ट का उपयोग करने की सलाह देता हूं । यह सिंकिंग डेटा के लिए बहुत अच्छी तरह से काम करता है। एंड्रॉइड के लिए, एक ही कंपनी जो उपरोक्त Couchbase Lite प्रोजेक्ट बनाती है, एक समान ऑफ़र पर काम कर रही है - Android के लिए Couchbase Lite । यह iOS संस्करण की तरह पूर्ण नहीं है और इसे पूरा करने के लिए कुछ काम बाकी है।

हालांकि CouchDB के साथ विचार करने के लिए कुछ चीजें हैं।

  1. आपको अपना संघर्ष समाधान प्रदान करने की आवश्यकता होगी। सौभाग्य से, यदि संघर्ष होते हैं, तो काउचडी ने विवादित संस्करणों और पिक्स और मनमाने ढंग से रखता है, लेकिन मुख्य संस्करण के रूप में निर्धारित करने के लिए निर्धारक संघर्ष। तो आप अपने प्रारंभिक संस्करण के लिए संघर्ष के समाधान में देरी पर विचार कर सकते हैं।
  2. प्रतिकृति तंत्र प्रतिकृति डेटाबेस के लिए बनाया गया है, प्रति-तुल्यकालन नहीं। इसलिए यदि आपके पास बहुत सारे हटाए गए दस्तावेज़ हैं, तो सर्वर से क्लाइंट तक आपकी प्रतिकृति में अधिक समय और लंबा समय लगेगा। "डेटाबेस रोटेशन" का उपयोग करके इससे बचने का एक तरीका है। यह अनिवार्य रूप से पुराने हटाने को हटा देता है।
  3. आप प्रतिकृति आदेश को नियंत्रित नहीं कर सकते। हालाँकि, आप प्रतिकृति प्रदर्शन को बेहतर बनाने के लिए कुछ चतुर समाधान कर सकते हैं जैसे कि पहले कुछ दस्तावेज़ प्राप्त करने के लिए फ़िल्टर्ड प्रतिकृति का उपयोग करना, या यहां तक ​​कि सीधे ऑन-डिमांड सर्वर का उपयोग करना।
  4. आईओएस पर पृष्ठभूमि में प्रतिकृति नहीं होगी। पृष्ठभूमि प्रतिकृति के कुछ मामलों को प्रदान करने के लिए आप iOS एसडीके का उपयोग कर सकते हैं।

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


API के लिए मेरी योजना CodeIgniter का उपयोग करके एक RESTful API को लागू करना था, जो कि DB समाधान जो भी आवश्यक था, के साथ बातचीत करेगा। मैं एक DB प्रणाली है कि एपीआई में बनाया गया था का उपयोग करने के बारे में नहीं सोच रहा था। क्या मेरी योजना आपके उत्तर से असहमत है?
प्रोग्रामरन्यूबी

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

कृपया अपनी "RDBMS की आवश्यकता" निर्दिष्ट करें। यह क्या प्रदान करता है कि CouchDb नहीं करता है? CouchDb एक NoSQL डेटाबेस है, इसलिए आपको एक अतिरिक्त MySQL की आवश्यकता नहीं होगी। इसके शीर्ष पर, CouchDb आपको मिडिल टियर के बिना एक लंबा रास्ता तय कर सकता है क्योंकि आप जावास्क्रिप्ट का उपयोग करके एपीआई कॉल को बाधित कर सकते हैं और अपने आउटपुट को विचारों के साथ बना सकते हैं।
सेबस्टियन

@ProgrammerNewbie, ऐसा लगता है कि आपकी योजना आम तौर पर अच्छी है: डेटाबेस से एपीआई अमूर्त है। CouchDB ऐसा करता है, लेकिन आप इस तथ्य से पूरी तरह से अलग नहीं हैं कि यह CouchDB है। आपके दूसरे प्रश्न के बारे में, मुझे नहीं पता कि आपको RDBMS की आवश्यकता क्यों है। CouchDB डेटा, फिल्टर, परिवर्तन ट्रैकिंग, और बहुत कुछ पर प्रश्न प्रदान करने के लिए नक्शा / कम दृश्य प्रदान करता है।
डेविड वी

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