मैं सेवा कपड़े के लिए कुछ सर्वोत्तम प्रथाओं को समझने की कोशिश कर रहा हूं।सेवा फैब्रिक विश्वसनीय कतार लंबे ऑपरेशन
यदि मेरे पास एक कतार है जो किसी वेब सेवा या किसी अन्य तंत्र द्वारा जोड़ा गया है और उस कतार को संसाधित करने के लिए एक बैक एंड टास्क है, तो पृष्ठभूमि में लंबे समय तक चलने वाले संचालन को संभालने का सबसे अच्छा तरीका क्या है।
- एक लेनदेन, प्रक्रिया में TryPeekAsync का उपयोग करें और फिर यदि सफलतापूर्वक प्रयास करने के लिए TryDequeueAsync का उपयोग करें।
- किसी आइटम को निकालने के लिए 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 आइटम क्लोनिंग के बारे में टिप्पणी के बारे में यदि आप इसे उत्परिवर्तित करने के लिए, "अनुशंसाएँ" भाग के नीचे देखें हैं:
मेरे साथ समस्या यह है कि यह कुछ समय के लिए लेनदेन को खोलता है जो सही नहीं लगता है। अगर ऑपरेशन 4 सेकंड से अधिक समय लेता है, तो लेनदेन वैसे भी विफल रहता है। –
"कुछ समय" कितना समय है? साथ ही, आप कतार में कितनी बार सामान जोड़ते हैं? – anderso
कल्पना करें कि कुछ समय 1 मिनट हो सकता है। जोड़ने के लिए, चरम समय पर एक बार कई बार हो सकता है। मुझे पता है कि क्या आप इसे चरम पर ले जाते हैं तो आप केवल काम का बैक अप ले सकते हैं। जो मैं खोजने की कोशिश कर रहा हूं वह सिस्टम में डेडलॉक के बिना भरोसेमंद प्रसंस्करण के लिए सबसे अच्छा अभ्यास है। –