2015-11-19 15 views
5

मैं सेवा कपड़े के लिए नया हूं और विषय को कवर करने वाले एमएसडीएन लेखों को देखकर शुरू किया। मैंने हैलो वर्ल्ड नमूना here को लागू करके शुरू किया।सेवा फैब्रिक - स्टेटफुल सेवा सेवा

मैं करने के लिए उनके मूल RunAsync कार्यान्वयन बदल दिया है:

var myDictionary = await this.StateManager.GetOrAddAsync<IReliableDictionary<int, DataObject>>("myDictionary"); 

while (!cancellationToken.IsCancellationRequested) 
{ 
    DataObject dataObject; 

    using (var tx = this.StateManager.CreateTransaction()) 
    { 
     var result = await myDictionary.TryGetValueAsync(tx, 1); 

     if (result.HasValue) 
      dataObject = result.Value; 
     else 
      dataObject = new DataObject(); 
     // 
     dataObject.UpdateDate = DateTime.Now; 
     // 
     //ServiceEventSource.Current.ServiceMessage(
     // this, 
     // "Current Counter Value: {0}", 
     // result.HasValue ? result.Value.ToString() : "Value does not exist."); 

     await myDictionary.AddOrUpdateAsync(tx, 1, dataObject, ((k, o) => dataObject)); 

     await tx.CommitAsync(); 
    } 
    await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); 
} 

मैं भी एक DataObject प्रकार शुरू की है और उस प्रकार पर एक अद्यतन किया संपत्ति उजागर कर दिया है।

[DataContract(Namespace = "http://www.contoso.com")] 
public class DataObject 
{ 
    [DataMember] 
    public DateTime UpdateDate { get; set; } 
} 

जब मैं एप्लिकेशन (विजुअल स्टूडियो 2015 में F5), एक dataObject उदाहरण (1 के रूप में keyed) चलाने के लिए, शब्दकोश तो मैं एक बनाने के लिए, सेट अद्यतन किया में नहीं पाया जाता शब्दकोश में जोड़ने और लेनदेन प्रतिबद्ध करें। अगले लूप के दौरान, यह डेटा ऑब्जेक्ट (1 के रूप में की गई) पाता है और अपडेटडेट सेट करता है, शब्दकोश में ऑब्जेक्ट को अपडेट करता है और लेनदेन करता है। उत्तम।

मेरा प्रश्न यहां है। जब मैं सेवा प्रोजेक्ट को रोकता हूं और पुनरारंभ करता हूं (विजुअल स्टूडियो 2015 में F5) मैं उम्मीद करता हूं कि RunAsync के पहले पुनरावृत्ति पर डेटाऑब्जेक्ट (1 के रूप में की गई) पाए जाएंगे लेकिन ऐसा नहीं है। मैं उम्मीद करता हूं कि सभी राज्य अपनी प्रतिकृति में फंस जाएंगे।

क्या मुझे राज्य की सेवा के लिए अपनी आंतरिक प्रतिकृति में अपने आंतरिक राज्य को फ्लश करने के लिए कुछ भी करना है?

जो मैंने पढ़ा है, उससे यह अच्छा लगता है कि यह सब सेवा कपड़े द्वारा संभाला जाता है और कॉलिंग प्रतिबद्ध (लेनदेन पर) पर्याप्त है। यदि मैं प्राथमिक प्रतिकृति (सेवा फैब्रिक एक्सप्लोरर-> एप्लिकेशन व्यू में) का पता लगाता हूं तो मैं देख सकता हूं कि रिमोटरप्लिकेटर_xxx LastACKProcessedTimeUTC को लेनदेन करने के बाद अपडेट किया जाता है (जब चरणबद्ध हो)।

किसी भी मदद की बहुत सराहना की जाती है।

धन्यवाद!

मार्क

उत्तर

4

यह दृश्य स्टूडियो में डिफ़ॉल्ट स्थानीय विकास के अनुभव के एक समारोह है। आप F5 से टकराने के बाद बारीकी से आउटपुट खिड़की घड़ी, तो आप इस तरह एक संदेश दिखाई देगा:

Visual Studio output window during Service Fabric deployment

तैनाती स्क्रिप्ट का पता लगाता है वहाँ एक ही प्रकार और संस्करण पहले से ही पंजीकृत के एक मौजूदा अनुप्रयोग है कि, तो यह उसे निकाल देता है और नया तैनात करता है। ऐसा करने में, पुराने एप्लिकेशन से जुड़े डेटा को हटा दिया जाता है।

आपके पास इससे निपटने के लिए कुछ विकल्प हैं।

उत्पादन में, आप राज्य को बनाए रखते हुए अद्यतन कोड को सुरक्षित रूप से रोल करने के लिए application upgrade प्रदर्शन करेंगे। लेकिन अपने देव बॉक्स पर त्वरित पुनरावृत्ति करते समय लगातार अपने संस्करणों को अपडेट करना कठिन हो सकता है।

एक विकल्प प्रॉपर्टी प्रॉपर्टी "स्टार्ट ऑन डेटा स्टार्ट" को "हां" में फ़्लिप करना है। यह स्वचालित रूप से जेनरेट किए गए एप्लिकेशन पैकेज के सभी संस्करणों को टक्कर देगा (आपके स्रोत में संस्करणों को छूए बिना) और फिर अपनी ओर से एक ऐप अपग्रेड करें।

enter image description here

ध्यान दें कि क्योंकि सिस्टम जांच उन्नयन पथ में निहित में से कुछ की, इस तैनाती के विकल्प थोड़ा डिफ़ॉल्ट की तुलना में धीमी हटाने एवं प्रतिस्थापन होने की संभावना है। हालांकि, जब आप टेस्ट डेटा को फिर से बनाने में लगते हैं, तो यह अक्सर धोया जाता है।

+0

धन्यवाद शॉन। मेरी परियोजना गुण (sfproj प्रोजेक्ट पर) गुण विंडो में कोई अनुप्रयोग समूह नहीं दिखाते हैं। क्या मुझे संभवतः एक बनाम 2014 अपडेट या ... चाहिए? मेरे पास विजुअल स्टूडियो सर्विस फैब्रिक टूल्स स्थापित हैं (प्रारंभ पृष्ठ से एसडीके)। एक बार फिर धन्यवाद! – markondotnet

+0

आपने एसडीके कब इंस्टॉल किया? यह सुविधा सार्वजनिक पूर्वावलोकन रिलीज में नई है जो कल लाइव हो गई थी। –

+0

मैंने इसे पिछले रविवार को स्थापित किया और आज ही देखा (बनाम2015 अधिसूचनाओं में) कि v2.8 बाहर था (कल के रूप में) इसलिए मैंने इसे स्थापित किया। अभी भी परियोजना के गुणों पर "प्रारंभ पर डेटा संरक्षित करें" विकल्प नहीं है। – markondotnet

3

आपको संदर्भों के संग्रह के विपरीत वस्तुओं के संग्रह को पकड़ने के रूप में एक विश्वसनीय डिक्शनरी के बारे में सोचने की आवश्यकता है। यही है, जब आप शब्दकोश में "ऑब्जेक्ट" जोड़ते हैं, तो आपको यह सोचना चाहिए कि आप ऑब्जेक्ट को पूरी तरह से बंद कर रहे हैं; और आपको अब इस ऑब्जेक्ट की स्थिति को बदलना नहीं चाहिए। जब आप "ऑब्जेक्ट" के लिए विश्वसनीय डिक्शनरी से पूछते हैं, तो यह आपको अपनी आंतरिक वस्तु का संदर्भ देता है। संदर्भ प्रदर्शन कारणों से संदर्भित किया गया है और आप ऑब्जेक्ट की स्थिति को पढ़ने के लिए स्वतंत्र हैं। (यह बहुत अच्छा होगा अगर सीएलआर ने केवल पढ़ने योग्य वस्तुओं का समर्थन किया लेकिन यह नहीं करता है।) हालांकि, आपको ऑब्जेक्ट की स्थिति को संशोधित नहीं करना चाहिए (या ऑब्जेक्ट की स्थिति को संशोधित करने वाले किसी भी तरीके को कॉल करना) क्योंकि आप आंतरिक डेटा संरचनाओं को संशोधित करेंगे शब्दकोश के राज्य भ्रष्ट करने के लिए।

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

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