दो-तरफा सिंक के लिए संघर्ष का संकल्प


24

आप एक 'मुख्य' डेटाबेस सर्वर और कई 'सेकेंडरी' सर्वरों के बीच दो-तरफा सिंक्रनाइज़ेशन का प्रबंधन कैसे करते हैं, विशेष रूप से संघर्ष समाधान में, यह मानते हुए कि हमेशा कनेक्शन उपलब्ध नहीं है?

उदाहरण के लिए, मेरे पास एक मोबाइल ऐप है जो iOS पर CoreData को 'डेटाबेस' के रूप में उपयोग करता है और मैं उपयोगकर्ताओं को इंटरनेट कनेक्शन के बिना सामग्री को संपादित करने की अनुमति देना चाहूंगा। उसी समय, यह जानकारी एक वेबसाइट पर उपलब्ध होती है, जिससे डिवाइस कनेक्ट होंगे। यदि मैं दो DB सर्वर पर डेटा संघर्ष में है / तो क्या करूँ?
(मैं कोरडेटा को एक डीबी सर्वर के रूप में संदर्भित करता हूं, हालांकि मुझे पता है कि यह कुछ अलग है।)

क्या इस तरह के मुद्दे से निपटने के लिए कोई सामान्य रणनीति है? ये वे विकल्प हैं जिनके बारे में मैं सोच सकता हूं:
1. हमेशा क्लाइंट-साइड डेटा को उच्च-प्राथमिकता के रूप में उपयोग करें
2. सर्वर-साइड के लिए एक ही
। प्रत्येक फ़ील्ड के टाइमस्टैम्प को चिह्नित करके और नवीनतम संपादन करके संघर्षों को हल करने का प्रयास करें।

हालांकि मैं निश्चित हूं कि तीसरा विकल्प कुछ विनाशकारी डेटा भ्रष्टाचार के लिए कमरा खोलेगा।

मुझे पता है कि सीएपी प्रमेय इस पर चिंता करता है, लेकिन मैं केवल अंतिम स्थिरता चाहता हूं, इसलिए यह पूरी तरह से सही नहीं है?

संबंधित प्रश्न: दो-तरफ़ा डेटा सिंक्रनाइज़ेशन के लिए सर्वोत्तम अभ्यास पैटर्न । इस प्रश्न का दूसरा उत्तर यह कहता है कि यह शायद नहीं किया जा सकता है।


जवाबों:


14

"कौन सा परिवर्तन सही है" जानने के लिए सामान्य समाधान एक वेक्टर घड़ी है । आप अनिवार्य रूप से डेटा को रखने वाले प्रत्येक रिपॉजिटरी के लिए काउंटरों का ट्रैक रखते हैं, और परिवर्तनों को अस्वीकार करते हैं यदि किसी अन्य ग्राहक के राज्य के बारे में किसी विशेष ग्राहक का दृष्टिकोण उस सहकर्मी से भिन्न होता है जिसे वह कनेक्ट कर रहा है।

आपको जिस बड़े सवाल का जवाब देना है, वह यह है कि आप अस्वीकार किए गए बचत को कैसे हल करेंगे। यह आमतौर पर मर्ज ऑपरेशन के कुछ प्रकार का मतलब है।

ध्यान दें कि वेक्टर घड़ियों वास्तविक समय टाइमस्टैम्प का उपयोग नहीं करती हैं। वास्तविक समय की घड़ियों को सिंक्रनाइज़ करने में शामिल समस्याएं कम से कम डेटा को सिंक्रनाइज़ करने के रूप में मुश्किल हैं।


1
अच्छा, यह मैं देख रहा था
K.Steff

10

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


ठीक है, लेकिन इन लोगों को एक समान प्रभाव कैसे मिलता है: सिंकपाइंट विकास
Ktete

3
वे बस मान लेते हैं कि आपके पास भविष्य में किसी समय पर्याप्त बैंडविड्थ का विश्वसनीय कनेक्शन होगा।
डेडएमजी

1

मुझे लगता है कि ऐसा करने के लिए कोई मानक तरीका नहीं है, प्रत्येक सिस्टम संघर्ष समाधान के लिए अपनी नीतियों का उपयोग करता है।

मैंने दो उपकरणों, कंप्यूटर और फोन, और Google स्प्रैडशीट का उपयोग करके कुछ सिमुलेशन किए हैं ताकि यह जांचा जा सके कि Google डॉक्स स्वचालित रूप से संघर्षों को कैसे संभालता है। यहाँ कुछ मामले हैं:

मामला एक

  1. कंप्यूटर और फोन ऑफ़लाइन हैं
  2. कंप्यूटर 'वैल्यू' के साथ सेल एडिट करता है और वैल्यू 'फोन' के साथ सेल एडिट सेल के बाद
  3. कंप्यूटर ऑनलाइन हो गया
  4. फोन ऑनलाइन हो जाता है और कंप्यूटर और फोन दोनों 'फोन' प्रदर्शित करते हैं।

केस 2

  1. कंप्यूटर और फोन ऑफ़लाइन हैं
  2. कंप्यूटर 'वैल्यू' के साथ सेल एडिट करता है और वैल्यू 'फोन' के साथ सेल एडिट सेल के बाद
  3. फोन ऑनलाइन हो गया
  4. कंप्यूटर ऑनलाइन हो जाता है और कंप्यूटर और फोन दोनों 'कंप्यूटर' प्रदर्शित करते हैं।

इसलिए कम से कम Google डॉक्स सर्वर इसे प्राप्त किए गए अंतिम डेटा का उपयोग उच्च प्राथमिकता के रूप में करता है जब इसे बनाया गया था (क्लाइंट का टाइमस्टैम्प)। मैंने यह भी परीक्षण किया कि क्या वे पृष्ठभूमि में सिंक बनाते हैं, और जाहिरा तौर पर वे ऐसा नहीं करते हैं, इसलिए संघर्ष समाधान का परिणाम उपयोगकर्ता के लिए पारदर्शी है।

दूसरे हाथ में जीआईटी, स्वचालित रूप से संघर्षों को संभालता नहीं है, बल्कि अंतिम उपयोगकर्ता को सौंपता है जो रिपॉजिटरी को बदलने की कोशिश कर रहा था कि मर्ज कैसे किया जाना चाहिए।

मैं Google डॉक्स दृष्टिकोण के लिए जाऊंगा यदि यह ठीक है केवल अग्रभूमि पर सिंक करें, उपयोगकर्ता डेटा की कल्पना के साथ। अन्यथा एक उपयोगकर्ता आश्चर्यचकित हो सकता है कि जबकि उसका फोन स्वचालित रूप से वाईफाई से जुड़ा हुआ है एक बैठक में एक गैर-सिंक परिवर्तन होता है जिसे उसने अपने पीसी पर फिर से संपादित किया है।

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

मैं जीआईटी दृष्टिकोण के लिए जाऊंगा, अन्यथा अग्रभूमि में अगले ग्राहक में एक पॉपअप दिखाकर उपयोगकर्ता को यह पूछने के लिए कि कौन सा संस्करण चुनना है या मर्ज को वापस करने का मौका देना है।


1
मैं मानता हूं कि केस-बाय-केस एप्रोच यहां जाने का उपयुक्त तरीका है। "सबसे अच्छा" तरीका (गिट दृष्टिकोण) हमेशा लागू नहीं होता है, क्योंकि उपयोगकर्ता परिवर्तनों की समीक्षा / विलय नहीं करना चाहते हैं
K.Steff
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.