2016-03-01 11 views
9

मैं सेवा कपड़े के लिए कुछ सर्वोत्तम प्रथाओं को समझने की कोशिश कर रहा हूं।सेवा फैब्रिक विश्वसनीय कतार लंबे ऑपरेशन

यदि मेरे पास एक कतार है जो किसी वेब सेवा या किसी अन्य तंत्र द्वारा जोड़ा गया है और उस कतार को संसाधित करने के लिए एक बैक एंड टास्क है, तो पृष्ठभूमि में लंबे समय तक चलने वाले संचालन को संभालने का सबसे अच्छा तरीका क्या है।

  1. एक लेनदेन, प्रक्रिया में TryPeekAsync का उपयोग करें और फिर यदि सफलतापूर्वक प्रयास करने के लिए TryDequeueAsync का उपयोग करें।
  2. किसी आइटम को निकालने के लिए TryDequeueAsync का उपयोग करें, इसे एक शब्दकोश में डालें और फिर पूरा होने पर शब्दकोश से हटा दें। सेवा के स्टार्टअप पर, कतार से पहले लंबित कुछ भी के लिए शब्दकोश देखें।

दोनों तरीकों से थोड़ा गलत लगता है, लेकिन अगर कोई बेहतर तरीका है तो मैं काम नहीं कर सकता।

protected override async Task RunAsync(CancellationToken cancellationToken) 
{ 
    var store = await StateManager.GetOrAddAsync<IReliableQueue<T>>("MyStore").ConfigureAwait(false); 
    while (!cancellationToken.IsCancellationRequested) 
    { 
     using (var tx = StateManager.CreateTransaction()) 
     { 
      var itemFromQueue = await store.TryDequeueAsync(tx).ConfigureAwait(false); 
      if (!itemFromQueue.HasValue) 
      { 
       await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false); 
       continue; 
      } 

      // Process item here 
      // Remmber to clone the dequeued item if it is a custom type and you are going to mutate it. 
      // If success, await tx.CommitAsync(); 
      // If failure to process, either let it run out of the Using transaction scope, or call tx.Abort(); 
     } 
    } 
} 

dequeued आइटम क्लोनिंग के बारे में टिप्पणी के बारे में यदि आप इसे उत्परिवर्तित करने के लिए, "अनुशंसाएँ" भाग के नीचे देखें हैं:

उत्तर

12

एक विकल्प RunAsync में कतार, इस की तर्ज पर कुछ कार्रवाई करने के लिए है यहां: https://azure.microsoft.com/en-us/documentation/articles/service-fabric-reliable-services-reliable-collections/

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

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

एक और विकल्प कतार के रूप में कार्य करने के लिए एक टिकाऊ पब/उप कार्यान्वयन बनाना होगा। मैंने इसके लिए अभिनेताओं का उपयोग करने से पहले परीक्षण किए हैं, और यह एक व्यवहार्य विकल्प प्रतीत होता है, बिना उस पर अधिक समय व्यतीत किए, क्योंकि सर्विसबस के आधार पर हमारे पास कोई समस्या नहीं थी। यहां Pub/sub pattern in Azure Service Fabric

+0

मेरे साथ समस्या यह है कि यह कुछ समय के लिए लेनदेन को खोलता है जो सही नहीं लगता है। अगर ऑपरेशन 4 सेकंड से अधिक समय लेता है, तो लेनदेन वैसे भी विफल रहता है। –

+0

"कुछ समय" कितना समय है? साथ ही, आप कतार में कितनी बार सामान जोड़ते हैं? – anderso

+0

कल्पना करें कि कुछ समय 1 मिनट हो सकता है। जोड़ने के लिए, चरम समय पर एक बार कई बार हो सकता है। मुझे पता है कि क्या आप इसे चरम पर ले जाते हैं तो आप केवल काम का बैक अप ले सकते हैं। जो मैं खोजने की कोशिश कर रहा हूं वह सिस्टम में डेडलॉक के बिना भरोसेमंद प्रसंस्करण के लिए सबसे अच्छा अभ्यास है। –

2

यदि बहुत धीमी गति से 2 कतार का उपयोग किया जाता है .. एक तेज़ व्यक्ति जहां आप बिना रुकावट के काम को संग्रहीत करते हैं और इसे धीमा करने के लिए धीमे होते हैं। RunAsync का उपयोग तेजी से संदेशों को धीमे से स्थानांतरित करने के लिए किया जाता है।

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