2016-02-07 12 views
8

मैंने ऑरलिंस एफएक्यू में पढ़ा है जब विभाजन-मस्तिष्क हो सकता है लेकिन मुझे समझ में नहीं आता कि क्या बुरा हो सकता है और इसे कैसे ठीक से संभालना है।विभाजन-मस्तिष्क को कैसे संभालें?

पूछे जाने वाले प्रश्न का कहना है कुछ की तरह अस्पष्ट:

तुम बस, जबकि आपके आवेदन लेखन एक अभिनेता के दो उदाहरणों होने के दुर्लभ संभावना पर विचार करने की जरूरत है।

लेकिन मुझे वास्तव में इस पर विचार करना चाहिए और यदि मैं नहीं करूँ तो क्या हो सकता है?

ऑरलियन्स कागज (http://research.microsoft.com/pubs/210931/Orleans-MSR-TR-2014-41.pdf) इस कहते हैं:

आवेदन बाहरी लगातार भंडारण पर भरोसा कर सकते मजबूत डेटा स्थिरता प्रदान करने के लिए

लेकिन मुझे समझ नहीं आता कि इसका क्या मतलब।

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

उन्हें अपने राज्यों को कैसे जारी रखना चाहिए? एक संघर्ष हो सकता है।

जब एक और उदाहरण नष्ट हो जाएंगे और केवल एक ही रहेगा नष्ट किए गए उदाहरणों के राज्यों के साथ क्या होगा? यह उनके द्वारा संसाधित संदेशों की तरह कभी संसाधित नहीं किया जाएगा? फिर ग्राहक स्थिति और सर्वर स्थिति desucronized IIUC हो सकता है।

मुझे यह एक बड़ी समस्या के रूप में (विभाजन-मस्तिष्क) दिखाई देता है और मुझे समझ में नहीं आता कि इसका इतना ध्यान क्यों है।

उत्तर

7

ऑरलियन्स स्टोरेज प्रदाता की स्थिरता गारंटी प्रदान करता है। जब आप अनाज से this.WriteStateAsync() पर कॉल करते हैं, तो स्टोरेज प्रदाता यह सुनिश्चित करता है कि अनाज ने पिछले सभी लेखों को देखा हो। यदि ऐसा नहीं है, तो एक अपवाद फेंक दिया जाता है। आप उस अपवाद को पकड़ सकते हैं और DeactivateOnIdle() पर कॉल कर सकते हैं और अपवाद को फिर से हटा सकते हैं या ReadStateAsync() पर कॉल कर सकते हैं और पुनः प्रयास कर सकते हैं। तो यदि आपके पास एक विभाजन-मस्तिष्क परिदृश्य के दौरान 2 अनाज हैं, जो कभी भी WriteStateAsync() पर कॉल करता है, तो सबसे पहले सबसे ज्यादा अद्यतित राज्य पढ़ने के बिना दूसरे को लिखने से रोकता है।

अद्यतन: Orleans v1.5.0 में शुरू करना, एक अनाज जो InconsistentStateException को कॉलर पर वापस फेंकने की अनुमति देता है, वर्तमान में निष्पादित कॉल पूर्ण होने पर स्वचालित रूप से निष्क्रिय हो जाएगा। एक अनाज catch कर सकता है और स्वत: निष्क्रियता से बचने के लिए अपवाद को संभाल सकता है।

+2

क्या यह सच है, "एक अपवाद फेंक दिया गया है और अनाज अगले संदेश को संसाधित करने की अनुमति देने से पहले राज्य पढ़ेगा" जैसा कि मैंने देखा, असंगतस्टेट अपवाद को ढांचे द्वारा नियंत्रित नहीं किया जाता है। – lmagyar

+2

@LaszloMagyar आपका संदेह सही है। मैंने https://github.com/dotnet/orleans/issues/1420 खोला है और उत्तर को सही किया है। धन्यवाद :) –

+0

यह अभी भी उस परिदृश्य को कवर नहीं कर रहा है जहां एक अनाज को केवल पढ़ने वाले संदेश प्राप्त होते हैं और दूसरा व्यक्ति पढ़ने/लिखने वाले संदेश प्राप्त करता है- पूर्व पुराने डेटा के साथ जवाब देगा। –

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