2011-11-27 12 views
5

में विभिन्न अंतराल पर कार्य करें मेरे पास एक साधारण Azure वर्कर भूमिका चल रही है जो हर कुछ सेकंड में कार्य करती है। नीचे वह कोड है जो इसे पूरा करता है।Azure वर्कर रोल

public override void Run() 
    { 
     try 
     { 
      while (true) 
      { 
       DoSomething(); 
       System.Threading.Thread.Sleep(3000); 
      } 

     } 
     catch (Exception ex) 
     { 
      Log.Add(ex, true); 
     }    
    } 

मैं अब क्या करना चाहते हैं क्या एक दूसरे कार्य DoSomethingElse() है कि एक बार और प्रतिदिन केवल एक बार आग जोड़ने है।

  1. एक काउंटर है कि नए कार्य कॉल हर वें पाश
  2. नया कार्य की एक निर्धारित समय के लिए वर्तमान समय तुलना करने के लिए सशर्त तर्क जोड़ें: मैं तरीके पूरा करने के लिए इस की एक जोड़ी के बारे में सोचा गया है दिन
  3. (जैसे Quartz.NET के रूप में)

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

मेरा सवाल है, Azure वर्कर रोल के भीतर विभिन्न अंतराल पर कार्यों को शेड्यूल करने का सबसे अच्छा अभ्यास क्या है? मुझे सीधे .NET के साथ चिपकने और तीसरे पक्ष की लाइब्रेरी का उपयोग नहीं करने के लिए थोड़ी वरीयता है (हालांकि मैं इसे बाहर नहीं कर रहा हूं)।

ध्यान दें, ऊपर # 3 इस पुराने सवाल Recommend a C# Task Scheduling Library

उत्तर

2

पहले दो विकल्पों सरल कर रहे हैं से आता है, लेकिन वे भंगुर होते हैं - विशेष रूप से बादल जहां भूमिकाओं/लोड संतुलित आदि पुनर्नवीनीकरण किया जा सकता है ... हठ हैं बादल में आधारित स्मृति या डिस्क में भी है, तो यह भंगुर होगा।

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

यह जल्दी में जटिल हो सकता है लेकिन यदि आप आवृत्ति के साथ इसे सरल रखते हैं और रनिंग रनिंग रिकॉर्ड करते हैं, तो यह काफी सीधे हो सकता है।

+0

चलो इस पल के लिए कहें कि मैं निष्पादन डेटा को SQL Azure डेटाबेस में जारी रखता हूं। मैं DoSomethingElse() में एक साधारण चेक बना सकता हूं जो यह निर्धारित करने के लिए डेटाबेस को पिंग करता है कि कार्य आखिरी बार कब चलाया गया था। इसका मतलब यह होगा कि प्रत्येक 3 सेकंड में जांच करने के लिए डेटाबेस को पिंग करना होगा। क्या यह एक बुरा विचार है? यह डेटाबेस के लिए बहुत अनावश्यक यात्रा है। लेकिन फिर डेटाबेस सर्वर को ऐसे छोटे लेनदेन से परेशान होने की संभावना नहीं है। विचार? – hughesdan

1

स्टीव मार्क्स ने विंडोज़ Azure using blob leases पर how to build a task scheduler पर ब्लॉग प्रविष्टियों की एक अच्छी जोड़ी लिखी, मुझे लगता है कि आपको यह बहुत उपयोगी लगेगा।

+0

वह बताता है कि कार्यों को निर्धारित करने के लिए कैसे वितरित किया जाए। लेकिन वह इस बारे में कुछ भी नहीं कहता कि प्रारंभिक तर्क कैसे ट्रिगर होता है यानी एक कार्यकर्ता भूमिका को "अब" कैसे पता चलता है, जागने और जांचने का समय है कि तालिका में कोई कार्य निर्धारित है या नहीं? अच्छा लेख otehrwise – DeepSpace101

+0

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

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