2008-12-23 7 views
13

मैं अपने ऐप में एक सरल सिंक्रनाइज़ेशन क्षमता लिखने की सोच रहा हूं और पॉप-अप की गई चिंताओं में से एक दो दूरस्थ कंप्यूटरों के बीच समय का सिंक्रनाइज़ेशन है, प्रत्येक अपनी घड़ी के साथ (इन फाइल/वस्तुओं की संशोधन तिथियों के बारे में विशेष रूप से)।दो दूरस्थ कंप्यूटरों के बीच सिंक्रनाइज़ेशन (घड़ियों का)

मुझे यकीन है कि इस विषय पर बहुत सारे शोध किए गए हैं और सैद्धांतिक नहीं होना चाहते हैं, लेकिन मुझे आश्चर्य है कि रिमोट घड़ियों के बीच अस्थायी विसंगतियों को कम करने के लिए कोई स्वीकार्य सर्वोत्तम प्रथाएं हैं या नहीं?

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

एक समाधान स्थानीय सिस्टम घड़ी की बजाय वैश्विक समय सर्वर जैसे दोनों सिरों पर हमेशा एक ही घड़ी का उपयोग करना होगा। संभवतः यह (साझा संसाधन ताले के साथ संयुक्त) सिंक्रनाइज़ किए गए समय के आकस्मिक ओवरलैप की गारंटी दे सकता है, लेकिन यह बहुत व्यावहारिक नहीं है।

एक विचार है कि मेरे सिर में बस एक ही समय पर गणना की गई ऑफसेट के साथ प्रत्येक नोड (प्रत्येक क्लाइंट) को सिंक्रनाइज़ करना होगा, शायद वैश्विक घड़ी सर्वर के साथ सिस्टम घड़ी के ऑफ़सेट की गणना करके। यह केवल कभी-कभी किया जाना चाहिए क्योंकि ऑफसेट स्वयं ही थोड़े समय के दौरान काफी बदलाव नहीं करेगा।

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

उत्तर

18

आपके आवेदन के लिए एनटीपी पर निर्भर करते हुए दूसरों ने सिफारिश की है कि यह आसान फज है। सही दृष्टिकोण Lamport के वितरित घड़ी सिंक्रनाइज़ेशन एल्गोरिदम का उपयोग करना है। यह अपने क्लासिक 1 9 78 के पेपर Time, clocks, and the ordering of events in a distributed system में समझाया गया है।

+1

मैंने लैमपोर्ट के पेपर को देखा, और ऐसा लगता है कि घड़ी सिंक्रनाइज़ेशन की चर्चा में व्यापक रूप से उद्धृत किया गया है .. दुर्भाग्यवश, [ऐसा लगता है] (http://www.amazon.com/Distributed- सिस्टम- सिद्धांत- पैराडाइम्स-2nd/dp/0132392275) कि यह एल्गोरिदम वास्तविक समय अनुप्रयोगों के लिए उपयुक्त नहीं है (जैसा कि किसी ने चर्चा की [यहां] (http://stackoverflow.com/questions/12760388/how-to-set-a-variable-that-represent-a- समय-में-भविष्य में-पूर्ण-नियम-ओबीजे)) .. वास्तविक समय घड़ी सिंक्रनाइज़ेशन एल्गोरिदम पर कोई सुझाव जो गैर एनटीपी निर्भर है? – abbood

3

उन्हें NTP नेटवर्क टाइम प्रोटोकॉल के साथ सिंक्रनाइज़ करें।

आप किस मंच पर हैं?

एनटीपी के साथ आप अपने कंप्यूटर के समय परमाणु घड़ियों के साथ सिंक्रनाइज़ कर सकते हैं और दुनिया के आधिकारिक समय का उपयोग कर सकते हैं।

+0

.NET, लेकिन यह किसी भी चीज़ से अधिक सिद्धांत प्रश्न है। – devios1

3

घड़ियों को सिंक्रनाइज़ करने के लिए कोड लिखने के बजाय, क्या दोनों मशीनों पर सिर्फ एक एनटीपी क्लाइंट चलाने के लिए संभव नहीं होगा?

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

+0

मैं उपयोगकर्ता की सिस्टम घड़ी को बदलने पर बहुत उत्सुक नहीं हूं। – devios1

0

किसी भी नेटवर्क वाली मशीन को एनटीपी का उपयोग करना चाहिए। सभी आधुनिक प्रणालियों में इसे स्थापित करने का एक आसान तरीका शामिल है। एकमात्र मुद्दा एक विशिष्ट सर्वर का चयन करना चाहिए, अगर आपको थोड़ी अतिरिक्त परिशुद्धता की आवश्यकता है; लेकिन यह पहले से ही मिलीसेकंड रेंज में है, इसलिए मुझे परवाह नहीं है और आमतौर पर केवल pool.ntp.org

2

एक चीज जो हम करते हैं वह अनिवार्य रूप से 'होस्ट' मशीन पर सभी समय संचालन को ऑफ़लोड कर देती है। उदाहरण के लिए, यदि आपके पास 20 सर्वर हैं जो सभी डीबी साझा करते हैं, तो डीबी के समय का उपयोग करें। यदि आपके पास केंद्रीय सर्वर और दस लाख ग्राहक मशीन हैं, तो क्लाइंट मशीनों को कुछ भी समय के लिए ज़िम्मेदार नहीं होना चाहिए; अपने सभी सिंकिंग सर्वर-साइड करें।वास्तव में 'वितरित' वातावरण में, एक पी 2 पी नेटवर्क या कुछ की तरह, फ़ाइल का उपयोग सिंक्रनाइज़/नियंत्रित करने के लिए उस मशीन का उपयोग करें जो सबसे अधिक सीधे 'संसाधन' (वास्तविक पीसी जिसे आप लिखना चाहते हैं) का उपयोग करते हैं।

+0

ये अच्छे सुझाव हैं, और जितना अधिक उत्तर मैं ढूंढ रहा था। हालांकि, मान लें कि न तो कंप्यूटर संसाधन का मालिक है और यह वास्तव में साझा किया जाता है। इसके अलावा, न तो कंप्यूटर के पास अन्य कंप्यूटर तक सीधे पहुंच है और इसलिए इसकी घड़ी का उपयोग नहीं कर सकता है। – devios1

3

यह एक समस्या है जिसे मुझे वर्तमान में अत्याधुनिक अंत उपयोगकर्ताओं के संबंध में हल करना है जो पिछले योगदानकर्ताओं द्वारा किए गए समझदार सुझावों को परेशान करने के लिए कई चीजें कर सकते हैं। एक अपरिष्कृत अंतिम-उपयोगकर्ता कम से कम इन कर सकते हैं, और अधिक:

1) नहीं) NTP समय तुल्यकालन

2 की स्थापना के लिए एक घर घड़ी को अपने कंप्यूटर समय घड़ी सेट करने के लिए सक्षम होने के लिए पर्याप्त कंप्यूटिंग ज्ञान है या मोबाइल फोन घड़ी गलत है कि

3) Windows XP में गलती से NTP समय सिंक को अक्षम करके कैसे फिर से सक्षम या वे अपने कंप्यूटर की तारीख को गलत तरीके से निर्धारित करते हैं, जो मामले में विंडोज NTP काम नहीं करता है करने के लिए पता

4) कंप्यूटर बायोस बैटरी फ्लैट हो गई है इसलिए पीसी हमेशा 1 9 70 में शुरू होता है!

5) उपयोगकर्ता अपने लैपटॉप को विदेश में ले जाता है और अस्थायी रूप से लैपटॉप घड़ी को स्थानीय समय पर सेट करता है लेकिन समय क्षेत्र नहीं बदलता है, इसलिए अब पीसी गलत यूटीसी समय वापस कर देगा !!!

तो आपके प्रोग्राम को स्वयं समय का प्रबंधन करना होगा, और निश्चित रूप से आप इसे न्यूनतम ओवरहेड के साथ करना चाहते हैं।

मान लीजिए कि आपके कार्यक्रम चलाने वाले दो अंत उपयोगकर्ताओं को कार्यक्रमों को भविष्य में एक ही पूर्ण समय पर कुछ करने की आवश्यकता है।

मैं इस योजना का प्रस्ताव करता हूं, जो क्रॉन नौकरियों के काम से कुछ विचार लेता है, अगर कोई इस विचार में सुधार का सुझाव दे तो मुझे खुशी होगी।

1) जब आपका एप्लिकेशन शुरू होता है, तो यह अपने स्वयं के आंतरिक यूटीसी समय को एक थैप पार्टी सर्वर या अपने स्वयं के सर्वर पर एक साबुन कॉल के माध्यम से एनटीपी करने के लिए सिंक्रनाइज़ करता है (जिसे आप स्वयं एनटीपी के साथ समय पर रख सकते हैं)।

2) उसके बाद यह समय बनाए रखने के लिए सिस्टम घड़ी से विलुप्त समय में जोड़ता है। यदि आवश्यकताएं कड़े हैं तो आपको अंतराल पर एनटीपी सिंक्रनाइज़ेशन दोहराने की आवश्यकता हो सकती है।

3) तब आवेदन भविष्य की नौकरियों की एक सूची को देखता है जिसे इसे समय पर करने की आवश्यकता होती है। इसे सबसे पुरानी नौकरी जाननी चाहिए।

4) फिर यह एक धागा बनाता है जो इसे शुरुआती नौकरी से पहले समय की नींद के लिए सोता है, कम सुरक्षा सुरक्षा मार्जिन, जो आपकी आवश्यकताओं के आधार पर 10 मिनट पहले, एक या दो दिन पहले हो सकता है इत्यादि

5) जब धागा उठता है, तो यह एक और साबुन कॉल के साथ पूर्ण समय को फिर से जांचता है, और तब सिस्टम समय की घड़ी पर निर्भर करता है जब तक कि पहली बार नौकरी नहीं की जाती बाहर।

6) जैसे ही नौकरी ट्रिगर होती है (इसे किसी अन्य धागे में चलाएं) समय-निगरानी धागा अगले कार्य समय की गणना करता है और अवधि के लिए खुद को सोने के लिए रखता है।विचार करने के लिए

संवर्द्धन:

1) एक उपयोगकर्ता नीचे तो तुम, एक पृष्ठभूमि प्रक्रिया या सेवा है, जो ऊपर ही तुल्यकालन योजना का उपयोग करता है की आवश्यकता हो सकती स्वतंत्र रूप से अपने काम की निगरानी के लिए, कारण काम करने से पहले अपने आवेदन बंद हो सकता है सूची, डेटाबेस या फ़ाइल में संग्रहीत, और समय में आवेदन शुरू करें। (विंडोज़ में, एप्लिकेशन प्रक्रिया को बढ़ाएं)

2) आपका आवेदन फ्लाई पर नई, पहले की नौकरियां जोड़ना या नौकरियों को हटाना हो सकता है, इसलिए आपके सोने के धागे को शायद पहले की नौकरी के लिए पुन: गणना करने के लिए जागने की आवश्यकता होगी, या हटाए गए नौकरी के बाद नौकरी के लिए। Win32 में आप अपने थ्रेड द्वारा ऐसा ईवेंट पर टाइमआउट के साथ प्रतीक्षा करेंगे, जिसे आपने नींद के समय को फिर से समझने के लिए मजबूर किया है। लिनक्स में कोई संदेह नहीं है कि एक समान तंत्र है।

3) साबुन कॉल के लिए समय प्राप्त करने के लिए जब साबुन भेजा जाता है और प्रतिक्रिया प्राप्त होती है। यदि टर्नअराउंड समय बहुत लंबा है, तो आप उस समय भरोसा नहीं कर सकते हैं और कॉल को दोहराने की आवश्यकता हो सकती है, या आप समझौता कर सकते हैं। उदाहरण के लिए, यदि साबुन का कहना है कि कंप्यूटर घड़ी 5 मिनट तेज है, लेकिन साबुन कॉल ने जवाब देने में एक मिनट लगाया है, तो आप केवल यह सुनिश्चित कर सकते हैं कि कंप्यूटर घड़ी कम से कम 4 मिनट तेज है।

0

एनटीपी का उपयोग न करें। एनटीपी केवल दिनांक/समय प्राप्त करने के लिए है।

यह उन ऐप्स के बीच ईवेंट सिंक्रनाइज़ करने के लिए काम करता है जो संवाद नहीं करते हैं। उदाहरण के लिए, एक अलार्म ऐप और आपका शरीर।

उन ऐप्स के लिए जिनके पास प्रत्यक्ष संचार है, संसाधन साझा करना, लैमपोर्ट घड़ियों या वेक्टर घड़ियों का उपयोग डायमोडीस ने कहा है। घटनाओं के बीच आंशिक क्रम प्राप्त करने के लिए लैमपोर्ट घड़ियों महान काम करते हैं, जब आप समवर्ती घटनाओं की पहचान करने की आवश्यकता होती है तो वेक्टर घड़ियों बहुत अच्छे होते हैं।

5

आप पीटीपी का प्रयास कर सकते हैं, प्रेसिजन टाइम प्रोटोकॉल (पीटीपी) एक प्रोटोकॉल है जो कंप्यूटर नेटवर्क में घड़ियों को सिंक्रनाइज़ करने के लिए उपयोग किया जाता है। स्थानीय क्षेत्र नेटवर्क पर यह सब-माइक्रोसॉन्ड रेंज में घड़ी सटीकता प्राप्त करता है, जो इसे माप और नियंत्रण प्रणाली के लिए उपयुक्त बनाता है। http://en.wikipedia.org/wiki/Precision_Time_Protocol

संबंधित मुद्दे