मैं एक समाधान है कि लियोन और डेविड के समाधान से अलग है 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);
}
}
}
}
}
स्रोत
2012-06-07 13:32:11
इससे चलने वाली लागतें कैसे कम होंगी? आप एक उदाहरण एकल कंसुरेंसी सेवा से अलग क्या चाहते हैं? – Paparazzi
@ ब्लाम - वेब भूमिका में पृष्ठभूमि कार्यों को चलाने से संचालन के संयोजन को वीएम उदाहरणों के एक सेट में अनुमति मिलती है। यह भूमिका के उदाहरणों के एक अलग सेट में पृष्ठभूमि संचालन को रखने के विपरीत है। एक भूमिका में संयोजन लागत को बचाएगा, क्योंकि प्रत्येक भूमिका में कम से कम एक उदाहरण चलाना चाहिए। कम मात्रा वाली साइटों के लिए, यह एक महान लागत-बचत वास्तुकला है।यदि वेबसाइट को भूखा पृष्ठभूमि कार्यों का जोखिम है, या अलग-अलग और पृष्ठभूमि कार्यों को अलग-अलग स्केल करने की आवश्यकता है (या अलग-अलग वीएम आकार की ज़रूरतें हैं), तो अलग-अलग भूमिका में जाने पर विचार करना उचित है। –
@ डेविड मैकोगन धन्यवाद मुझे नहीं पता था कि एक वर्कर रोल को एक अलग उदाहरण की आवश्यकता है। और मैंने सवाल का जवाब नहीं दिया और जवाब नहीं दिया। +1 मैंने इस सवाल से बहुत कुछ सीखा। – Paparazzi