2012-06-07 17 views
6

WebRole.cs OnStart() विधि से थ्रेड चलाने के लिए इस तरह से संभव है कि हम पृष्ठभूमि कार्य करने के लिए एएसपीएक्स पेज के माध्यम से इसे एक्सेस कर सकें? मुझे पता है कि ऐसा करने का सही तरीका एक वर्कर रोल का उपयोग करना होगा, लेकिन मैं जितनी कम हो सके उतनी कम लागत को बनाए रखना चाहता हूं।Azure वेब रोल में पृष्ठभूमि धागा

विचार एक थ्रेड बनाना होगा जो हमेशा चल रहा होगा और नौकरी की प्रतीक्षा करेगा, उदाहरण के लिए यदि मैं एक ईमेल भेजने जैसे अवरोधन ऑपरेशन करना चाहता हूं तो मैं SendEmail विधि देकर थ्रेड का उपयोग करूंगा, क्या यह संभव है करने के लिए? यदि हां, तो क्या आप मुझे कुछ उदाहरण प्रदान कर सकते हैं जो मुझे सही दिशा में इंगित कर सकते हैं?

+0

इससे चलने वाली लागतें कैसे कम होंगी? आप एक उदाहरण एकल कंसुरेंसी सेवा से अलग क्या चाहते हैं? – Paparazzi

+3

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

+0

@ डेविड मैकोगन धन्यवाद मुझे नहीं पता था कि एक वर्कर रोल को एक अलग उदाहरण की आवश्यकता है। और मैंने सवाल का जवाब नहीं दिया और जवाब नहीं दिया। +1 मैंने इस सवाल से बहुत कुछ सीखा। – Paparazzi

उत्तर

10

मैं एक समाधान है कि लियोन और डेविड के समाधान से अलग है suggets होगा:

  • डेविड का समाधान ठीक है, लेकिन लचीला नहीं है। कार्य को संसाधित करते समय यह उदाहरण/प्रक्रिया ऑफ़लाइन हो जाती है?
  • लियोन का समाधान अधिकतर निर्धारित नौकरियों पर लागू होता है, लेकिन एक ईमेल भेजना हमेशा कुछ ऐसा नहीं होता है (शायद आप अपने ऐप में पंजीकृत होने पर एक ईमेल भेजना चाहते हैं)।

एक अन्य विकल्प (वे बहुत सस्ते हैं) इस परिदृश्य में आप पर विंडोज Azure संग्रहण कतार उपयोग कर रहा है दिखना चाहिए:

  • आपका वेब अनुप्रयोग: 'की तरह एक ईमेल भेज (कतार में संदेश भेजता है किसी को@someone.com ')
  • WebRole.cs: उदाहरण शुरू करते समय एक नया धागा उत्पन्न करें और यह उस कतार से संदेशों के लिए सुनें। जब भी कोई संदेश आता है, इसे संसाधित करें। अगर सफलता हो, तो कतार से संदेश हटा दें।

इस समाधान में कई फायदे हैं। WebRole.cs आपके वेब एप्लिकेशन की तुलना में एक अलग प्रक्रिया में चलता है, इसलिए अनुरोध धागे पर कोई प्रभाव नहीं पड़ता है। और इसके अलावा, यदि मेल भेजना किसी भी कारण से विफल रहता है, तो संदेश कतार में रहेगा और अगली बार संसाधित किया जाएगा। यह सुनिश्चित करेगा कि एप्लिकेशन या प्रक्रिया क्रैश होने पर आप निष्पादित करने के लिए किसी भी कार्य को खोले नहीं जाएंगे।

यहां शुरू करने के लिए एक उदाहरण दिया गया है। ध्यान दें कि यदि आप इसे तैयार करना चाहते हैं तो आपको इस कोड को बेहतर बनाने की आवश्यकता होगी (पॉलिसी, अपवाद हैंडलिंग, बैकऑफ मतदान, ...):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using Microsoft.WindowsAzure; 
using Microsoft.WindowsAzure.Diagnostics; 
using Microsoft.WindowsAzure.ServiceRuntime; 
using Microsoft.WindowsAzure.StorageClient; 
using System.Threading.Tasks; 

namespace MvcWebRole1 
{ 
    public class WebRole : RoleEntryPoint 
    { 
     public override bool OnStart() 
     { 
      Task.Factory.StartNew(InitializeQueueListener); 
      return base.OnStart(); 
     } 

     private void InitializeQueueListener() 
     { 
      Microsoft.WindowsAzure.CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) => 
      { 
       configSetter(Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetConfigurationSettingValue(configName)); 
      }); 


      var storageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString"); 
      var queueStorage = storageAccount.CreateCloudQueueClient(); 
      var queue = queueStorage.GetQueueReference("myqueue"); 
      queue.CreateIfNotExist(); 

      while (true) 
      { 
       CloudQueueMessage msg = queue.GetMessage(); 
       if (msg != null) 
       { 
        // DO SOMETHING HERE 
        queue.DeleteMessage(msg); 
       } 
       else 
       { 
        System.Threading.Thread.Sleep(1000); 
       } 
      } 
     } 
    } 
} 
+0

मैं जिस तरह के काम करने के इच्छुक हूं, उसके लिए एक बेहतर समाधान की तरह लगता है, वैसे भी मैं ऑन-प्रिमाइसेस एप्लिकेशन के साथ "बात करने" के लिए कतार रखने की योजना बना रहा था, इसलिए यह महंगा नहीं होगा ... क्या आप आगे विस्तार कर सकते हैं कि कैसे "उदाहरण शुरू करते समय एक नया धागा उड़ाएं और यह उस कतार से संदेशों के लिए सुनें"? ** यह बहुत अच्छा होगा अगर आप मुझे एक उदाहरण दे सकते हैं या मुझे नमूना में इंगित कर सकते हैं जो WebRole.cs ** में सुनवाई धागे शुरू करने में शामिल थ्रेडिंग भाग को समझाता है। धन्यवाद – ToinoBiclas

+0

सहमत - कतार बहुत लचीला हैं। मेरा इरादा धागे बनाने की व्यवहार्यता को इंगित करना था (जो हमेशा स्पष्ट नहीं होता है)। –

+0

@Sandrino मुझे बताएं कि यह आपके समाधान के साथ इनलाइन है ... WebRole.OnStart() 'नया थ्रेड (नया थ्रेडस्टार्ट (क्लासलिस्टिंग ToQueue.Method0)' में एक थ्रेड बनाएं, फिर Method0 के अंदर एक अनंत लूप या एक लूप को एक शर्त के साथ लिखें जो केवल WebRole.OnStop() 'के दौरान बदलता है (सत्य) {कोशिश करें {CloudQueueMessage msg = queue.GetMessage(); अगर (msg! = null) {' finnaly उदाहरण के अंदर मानों के अनुसार कार्य निष्पादित करता है उदाहरण के लिए मैं कर सकता था एक ऐसा क्षेत्र है जो इंगित करता है कि कॉल करने के लिए कौन सी विधि और पैरामीटर भी हैं। क्या यह मुख्य धागे के अंदर अन्य धागे को कॉल करना सुरक्षित है? – ToinoBiclas

1

मैं इस पाया जब मैं "नीला अनुसूचित कार्य" लिए देख रहा था: http://www.ronaldwidha.net/2011/02/23/cron-job-on-azure-using-scheduled-task-on-a-web-role-to-replace-azure-worker-role-for-background-job/

वास्तव में क्या आप देख रहे हैं ऐसा लगता है।

+0

उदाहरण जो आपने इंगित किया है वह अनुसूचित नौकरियों को चलाने के लिए है, लिनक्स में क्रॉन्टाब की तरह। मैं अपने धागे को संकेत देने के लिए इंतजार कर रहा हूं। – ToinoBiclas

+0

यह इंगित करना है कि इस तरह की चीजें करना निश्चित रूप से संभव है। मुझे लगता है कि आप केवल थोड़ी सी रचनात्मकता के साथ समाधान के साथ आ सकते हैं। –

2

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

+0

क्या आप मुझे यह कैसे करने के बारे में कुछ विवरण दे सकते हैं? मैं एएसपीएक्स वेब पृष्ठों में से किसी एक से थ्रेड वैरिएबल तक कैसे पहुंच सकता हूं यदि इसे वेबरोल में घोषित किया गया है: RoleEntryPoint? – ToinoBiclas

+2

यदि आपको अपने एएसपीएक्स पृष्ठों से धागे से बातचीत करने की आवश्यकता है, तो वैश्विक.एक्सएक्स से थ्रेड क्यों शुरू नहीं करें? RoleEntryPoint एक अलग ऐपडोमेन में चलाएगा ताकि आपके पास ऐप और थ्रेड के बीच बातचीत न हो। –

+0

ईमानदारी से इसके बारे में कभी नहीं सोचा। मैं global.asax में घोषित थ्रेड पूल के साथ कुछ परीक्षण करने की कोशिश करूंगा। – ToinoBiclas

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