एक बड़ी साइट पर पृष्ठभूमि कार्यों की सेवा


49

हम StackOverflow पर एक दिलचस्प समस्या से निपट रहे हैं।

हमें "जल्द ही-ईश" कार्यों को पूरा करने के लिए थोड़ा सा "पूरा" मिल गया है। एक उदाहरण "संबंधित प्रश्न" सूचियों को अद्यतन कर रहा है। अतीत में हमने जो किया है वह उन कार्यों को कुछ उपयोगकर्ताओं के पेज लोड पर वापस करने के लिए है।

यह कभी भी आदर्श नहीं था, लेकिन यह वास्तव में ध्यान देने योग्य नहीं था। अब जब SO ने 1,000,000 प्रश्न चिह्न को पार कर लिया है, तो उन अशुभ उपयोगकर्ताओं को यह महसूस होने लगा है।

प्राकृतिक समाधान वास्तव में इन कार्यों को पृष्ठभूमि में धकेलना है। ऐसा करने के दो व्यापक तरीके हैं जिन पर मैं विचार कर रहा हूं।

1. IIS में एक कस्टम थ्रेड-पूल / वर्क-क्यू के रूप में

असल में, हम कुछ (गैर ऊपर स्पिन ThreadPool , इतनी के रूप में आईआईएस के साथ हस्तक्षेप नहीं करने के लिए) धागे और उन्हें कुछ संग्रह हम धकेल कर रहे हैं सेवाओं है Funcs में।

यहाँ बड़ा समर्थक सादगी है। हमें किसी भी चीज़ के बारे में चिंता करने की ज़रूरत नहीं है, न ही हमें यह सुनिश्चित करना है कि कोई बाहरी सेवा शुरू हो रही है और जवाब दे रही है।

हम अपने सभी सामान्य कोड तक भी पहुँच प्राप्त करते हैं।

चोर, अच्छी तरह से है, कि हम पृष्ठभूमि धागे का उपयोग नहीं करना चाहिए। जिन आपत्तियों की मुझे जानकारी है, वे सभी भूखे IIS (यदि आप थ्रेडपूल का उपयोग करते हैं) और धागे बेतरतीब ढंग से (AppPool रीसाइक्लिंग के कारण) मर रहे हैं।

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

क्या मुझे IIS प्रक्रिया थ्रेड-पूलिंग / कार्य-कतार में कोई अन्य आपत्तियाँ याद आ रही हैं?

StackOverflow में ले जाया गया , क्योंकि यह वास्तव में यहाँ संबोधित नहीं किया गया था।

2. एक सेवा के रूप में

या तो कुछ तीसरे पक्ष के समाधान, या एक कस्टम एक।

मूल रूप से, हम कुछ कार्य के लिए प्रक्रिया सीमा के पार एक कार्य को पूरा करेंगे और बस इसके बारे में भूल जाएंगे। संभवतः हम कुछ कोड को लिंक कर रहे हैं या कच्चे SQL + एक कनेक्शन स्ट्रिंग तक सीमित कर रहे हैं।

समर्थक यह है कि ऐसा करने का "सही तरीका" है।

विपक्ष यह है कि हम या तो बहुत सीमित हैं जो हम कर सकते हैं, या हम इस सेवा को हमारे कोड आधार के साथ सिंक में रखने के लिए कुछ सिस्टम को काम करने जा रहे हैं। हमें अपनी निगरानी और त्रुटि को किसी भी तरह से लॉग इन करने की आवश्यकता होगी, जो हमें "इन आईआईएस" विकल्प के साथ मुफ्त में मिलेगा।

क्या सेवा के दृष्टिकोण के साथ कोई अन्य लाभ या समस्याएं हैं?

संक्षेप में, क्या अप्रत्याशित और दुर्गम समस्याएं हैं जो दृष्टिकोण # 1 को अस्थिर बनाती हैं और यदि कोई अच्छी तृतीय-पक्ष सेवाएं हैं तो हमें दृष्टिकोण # 2 के लिए देखना चाहिए?


सही तरीका वह तरीका है जब आप दूसरे तरीके से जाने का निर्णय लेते हैं और कहते हैं कि हमें वह सही तरीका करना चाहिए। बुद्धिमानी से चुनना। मैं इस विशेष समस्या पर टिप्पणी करने के लिए IIS दुनिया के साथ पर्याप्त रूप से परिचित नहीं हूं।
क्रिस

2
मैं उत्सुक हूं क्योंकि मेरे पास एक समान परिदृश्य है (बहुत छोटे पैमाने पर) और मैं भी सिर्फ कुछ यादृच्छिक उपयोगकर्ताओं के लिए बदकिस्मत कनेक्शन पर गुल्लक-बैकिंग कर रहा हूं। मैं सबसे अच्छे समाधान से परिचित नहीं हूं, इसलिए मैं यहां साथ चलूंगा। :-)
PC1oad1etter

7
मुझे नहीं लगता कि यह StackOverflow पर क्यों नहीं है। यह एक इंजीनियरिंग ट्रेडऑफ है, न कि व्यक्तिपरक मूल्यांकन। आप विभिन्न दृष्टिकोणों के विश्लेषण के लिए पूछ रहे हैं - यही सब उद्देश्य है। केवल जब विश्लेषण ने स्पष्ट किया है कि वास्तव में ट्रेडऑफ क्या हैं, तो क्या इसकी कोई व्यक्तिपरकता है, और जहां तक ​​मैं देख सकता हूं कि आपका सवाल 'नहीं है' मुझे और अधिक महत्वपूर्ण, मेरे समय और सर्वर संसाधनों या मेरे उपयोगकर्ता के समय का क्या पता होना चाहिए? ' या ऐसा ही कुछ।
जोरेन

@ केविन मॉन्ट्रोस - आपकी टिप्पणियों से, ऐसा लगता है जैसे आप "जल्द-से-जल्द किए जाने की आवश्यकता" और "एक अंतराल पर निर्धारित" के बीच अंतर कर रहे हैं। क्या आप इस बारे में विस्तार से बता सकते हैं कि क्यों दो अलग-अलग प्रकार के पृष्ठभूमि कार्य हैं जिनके लिए एक अलग पैटर्न / बुनियादी ढांचे की आवश्यकता होती है?
पोर्टमैन

@Portman - मूलभूत अंतर यह है कि "जल्द-से-जल्द" कार्य सट्टा नहीं किया जा सकता है, हमें वास्तव में तब तक इंतजार करने की आवश्यकता है जब तक हम जानते हैं कि उन्हें करने की आवश्यकता है। लिफाफे की गणना के कुछ पीछे से पता चलता है कि यदि हम "संबंधित प्रश्न" प्रश्नों (कई में से एक) को "गूंगा" क्रोन टैब पर ले जाते हैं, तो यह लगभग लगेगा। सभी प्रश्नों के माध्यम से काम करने के लिए एक सप्ताह का ठोस निष्पादन। आम तौर पर हम उन्हें भी जल्द से जल्द चलाना चाहते हैं (उपयोगकर्ता अनुभव को प्रभावित किए बिना), जबकि हमारे अंतराल के काम 5 मिनट (और सामान्य रूप से बहुत कम बार) में एक से अधिक बार नहीं चलने से प्राप्त कर सकते हैं।
केविन Montrose

जवाबों:


17

कुछ सप्ताह पहले मैंने एसओ पर एक समान प्रश्न पूछा था । अखरोट के खोल में, कुछ समय के लिए मेरा दृष्टिकोण अब एक विंडोज सेवा विकसित करने का है। मैं अपनी सेवा से अपने वेब ऐप से मार्शल अनुरोधों के लिए NServiceBus (अनिवार्य रूप से MSMQ कवर के तहत) का उपयोग करूंगा। मैं WCF का उपयोग करता था लेकिन WCF पर सही ढंग से काम करने के लिए एक वितरित लेनदेन प्राप्त करना हमेशा गधे में दर्द की तरह लगता था। NServiceBus ने चाल चली, मैं डेटा का लेन-देन कर सकता था और लेन-देन में कार्य कर सकता था और चिंता नहीं करता था कि मेरी सेवा उस समय चल रही थी या नहीं। एक सरल उदाहरण के रूप में, अगर कभी मुझे ईमेल भेजने की आवश्यकता होती है (उदाहरण के लिए एक पंजीकरण ईमेल) तो मैं उपयोगकर्ता खाता बनाऊंगा और लेनदेन में मेरी विंडोज सेवा (ईमेल भेजने के लिए) के संकेत को बंद कर दूंगा। सेवा की ओर संदेश संचालक संदेश ले जाएगा और तदनुसार प्रक्रिया करेगा।

चूंकि ASP .NET 4.0 और AppFabric जारी किया गया है, इसलिए ऊपर दिए गए तंत्र में कई व्यवहार्य विकल्प हैं। मेरे द्वारा उपर्युक्त प्रश्न का उल्लेख करते हुए, अब हमारे पास AppFabric का AppInitialize (net.pipe के माध्यम से) और साथ ही ASP .NET 4.0 का ऑटो-स्टार्ट फीचर है जो विंडोज़ सेवाओं को वेब ऐप्स के रूप में विकसित करना एक व्यवहार्य विकल्प है। मैंने कई कारणों से अब ऐसा करना शुरू कर दिया है (सबसे बड़ी बात यह है कि तैनाती में अब दर्द नहीं होता है):

  1. आप अपनी सेवा पर वेब UI विकसित कर सकते हैं (क्योंकि यह वेब ऐप के रूप में चल रहा है)। यह देखने के लिए बेहद उपयोगी है कि रनटाइम में क्या हो रहा है।
  2. आपके वेब एप्लिकेशन के लिए आपका परिनियोजन मॉडल आपके सेवा एप्लिकेशन के लिए काम करेगा।
  3. IIS अनुप्रयोग विफलताओं से निपटने के लिए कुछ स्वच्छ सुविधाएँ प्रदान करता है (एक Windows सेवा के कुछ मामलों में समान)।
  4. वेब डेवलपर्स वेब एप्लिकेशन (स्वाभाविक रूप से) विकसित करने से बहुत परिचित हैं, अधिकांश को विंडोज सर्विस विकसित करते समय सर्वश्रेष्ठ अभ्यास के बारे में ज्यादा जानकारी नहीं है।
  5. यह उपभोग करने के लिए अन्य एप्लिकेशन के लिए एपीआई को उजागर करने के लिए कई विकल्प प्रदान करता है।

यदि आप इस मार्ग पर जाते हैं (मुझे अपने मूल पोस्ट से कॉपी करने और चिपकाने के लिए क्षमा करें) मैं निश्चित रूप से एक अलग वेब एप्लिकेशन में पृष्ठभूमि तर्क को चलाने पर विचार करूंगा। इसके कई कारण हैं:

  1. सुरक्षा । यूआई के लिए एक अलग सुरक्षा मॉडल हो सकता है जो चल रही पृष्ठभूमि प्रक्रियाओं के बारे में जानकारी प्रदर्शित करता है। मैं इस UI को किसी और को नहीं बल्कि ऑप्स टीम को एक्सपोज करना चाहूंगा। इसके अलावा, वेब एप्लिकेशन एक अलग उपयोगकर्ता के रूप में चल सकता है जिसके पास अनुमतियों का एक ऊंचा सेट है।
  2. रखरखाव । फ्रंट एंड वेबसाइट का उपयोग करने वाले उपयोगकर्ता पर प्रभाव डाले बिना पृष्ठभूमि प्रक्रियाओं की मेजबानी करने वाले एप्लिकेशन में परिवर्तनों को तैनात करने में सक्षम होना बहुत अच्छा होगा।
  3. प्रदर्शन । एप्लिकेशन को मुख्य साइट प्रसंस्करण उपयोगकर्ता अनुरोधों से अलग करने का मतलब है कि पृष्ठभूमि धागे आने वाली अनुरोध कतार को संभालने के लिए IIS की क्षमता को कम नहीं करेंगे। इसके अलावा, यदि आवश्यक हो तो पृष्ठभूमि कार्यों को संसाधित करने वाले एप्लिकेशन को एक अलग सर्वर पर तैनात किया जा सकता है।

ऐसा करने से मार्शियल पहलू वापस आ जाता है। WCF, NServiceBus / RabbitMQ / ActiveMQ आदि, वैनिला MSMQ, RESTful API (थिंक MVC) सभी विकल्प हैं। यदि आप Windows वर्कफ़्लो 4.0 का उपयोग कर रहे हैं, तो आप एक होस्ट एंडपॉइंट को उजागर कर सकते हैं जिसे आपका वेब ऐप उपभोग कर सकता है।

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

नोट: मैंने मूल रूप से इस संदेश में कुछ और लिंक पोस्ट किए थे, लेकिन अफसोस, इस एक्सचेंज में यह मेरी पहली पोस्ट है और केवल एक लिंक समर्थित है! मूल रूप से दो अन्य लोग थे, उन्हें पाने के लिए Google "विंडोज सर्विसेज के लिए मौत ... लॉन्ग लाइव ऐप्पग्रिफ़िक!" और "ऑटो-स्टार्ट-एस्प-नेट-एप्लिकेशन"। उसके लिए माफ़ करना।


सेवा के रूप में एक अलग वेबसाइट का उपयोग करने का मूल विचार एक पेचीदा एक मैं नहीं माना जाता था ... है
केविन Montrose

रोह्लैंड, मुझे यहाँ कुछ याद आ रहा है, लेकिन आप कह रहे हैं कि आप अपने NServiceBus हैंडलर के अंदर से Windows सेवा के साथ बातचीत कर रहे थे, सेवा तब ईमेल भेजती है। यदि मैं सही हूं, तो क्या मैं पूछ सकता हूं कि आप सिर्फ एक NServiceBus संदेश हैंडलर से ईमेल क्यों नहीं भेजते हैं, जिसे विकसित करना, परीक्षण करना और तैनात करना बहुत आसान होगा?
सीन किरन

वेबसाइट विंडोज सेवा को एक संदेश भेजती है। Windows सेवा NServiceBus संदेश हैंडलर संदेश को चुनता है और संदेश भेजता है। संक्षेप में, यह वही प्रक्रिया है जिसका वर्णन आप कर रहे हैं।
रोह्लैंड

22

पृष्ठभूमि सेवाओं को चलाने के लिए विंडोज में वास्तव में एक तीसरा तरीका है, और यह यूनिक्स दुनिया में बहुत आम है। तीसरा तरीका एक CRONनौकरी है जो आपके बुनियादी ढांचे का एक टुकड़ा चलाता है। विंडोज में यह task schedulerएक निर्धारित आधार पर कोड चलाने के लिए बहुत सामान्य है। इसका उपयोग करने के लिए आप एक कमांड-लाइन ऐप बनाएंगे, जो एक पूर्व निर्धारित समय पर निष्पादित होता है। इसका लाभ यह है कि अगर आपको प्रक्रिया में रुकना और सेवा की तरह चलना है तो आपको परेशान होने की जरूरत नहीं है, क्योंकि यदि यह किसी कारण से विफल हो जाता है, तो यह अगली बार शुरू हो जाएगा।

विशिष्ट कार्यों के मार्शलिंग के रूप में, आपको वास्तव में इन कार्यों को लगातार बाइनरी स्टोरेज में स्टोर करने की आवश्यकता है। जब तक कमांड लाइन ऐप उन्हें स्टोरेज से बाहर नहीं निकालता और उन्हें निष्पादित नहीं करता है। मैंने पिछले दिनों कैसेंड्रा डेटाबेस में विशिष्ट उपयोगकर्ताओं के लिए पृष्ठभूमि कार्यों को भरने के लिए एक सेशन स्टेट प्रोवाइडर के रूप में कैसंड्रा डेटाबेस का उपयोग करते हुए ऐसा किया है, और फिर कमांडलाइन होने पर उन्हें उपयोगकर्ता के लिए निष्पादित करें और उन्हें निष्पादित करें।

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

बेशर्म प्रचार, लेकिन यह मेरी परियोजना है और इसका हल मैं अभी संक्षेप में बताता हूं कि मैंने परियोजना क्यों बनाई: http://github.com/managedfusion/fluentcassandra/


2
मैं अपनी साझा होस्टिंग सेवा के साथ ऐसा करता हूं क्योंकि मेरे पास शेल एक्सेस नहीं है। एक PHP पृष्ठ लिखें जो कुछ महत्वपूर्ण काम करता है, और फिर एक क्रॉन काम होता है जो समय-समय पर wget या lynx का उपयोग करके पृष्ठ को लोड करता है। ऐसा लगता है कि इस मामले में ठीक उसी प्रकार की चीज़ है जो इस मामले में काम करेगी और बेहद सरल होगी, जिस तरह से वर्तमान में काम किया जा रहा है, उसमें बदलाव की आवश्यकता नहीं है।
Ricket

क्या एक सरल उपाय है। इसने मेरी खुद की परियोजना के लिए विचारों को जन्म दिया है जिसे मैं अभी तक विचार नहीं कर रहा था। साथ ही आपके पास अपने मौजूदा कोड बेस की पूरी पहुंच है। बस समाधान के लिए एक सांत्वना परियोजना जोड़ें और मौजूदा परियोजनाओं को देखें।
टिम मर्फी

10

क्रोन + वेब ऐप

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

यहां देखिए यह कैसे काम करता है:

  1. निर्धारित पृष्ठभूमि कार्यों को संभालने के लिए अपने वेब एप्लिकेशन में एक नियंत्रक / कार्रवाई बनाएं। अधिवेशन से, मैं आमतौर पर मेरा आह्वान करता हूं http://mydomain.com/system/cron
  2. सुरक्षा के लिए, इस क्रिया को स्थानीय नेटवर्क पर केवल प्रमाणित IP पतों पर बंद किया जाना चाहिए।
  3. एक अलग मशीन पर, Wget स्थापित करें और एक शेड्यूल्ड टास्क को सेटअप करें। चरण 1 से संसाधन प्राप्त करने के लिए आप कार्य को जितनी बार चाहें चला सकते हैं (मैं आमतौर पर 30 सेकंड के लिए चुनते हैं)। Wget के लिए उपयुक्त कुकी तर्क पास करना न भूलें ताकि यह आपके वेब ऐप पर प्रमाणित हो।
  4. अतिरेक के लिए, आप एक दूसरी मशीन पर दूसरी शेड्यूल की गई वेज भी स्थापित कर सकते हैं।

हुर्रे! अब आपके पास एक मार्ग है जिसे हर 30 सेकंड में कहा जाएगा। और अगर अनुरोध को संसाधित होने में 5 मिनट लगते हैं, तो कोई भी परवाह नहीं करेगा, क्योंकि यह उपयोगकर्ता के पेज अनुरोध का हिस्सा नहीं है।

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

इससे भी महत्वपूर्ण बात (आपके लिए), इसका मतलब है कि आपकी नौकरियों को एक निश्चित समय पर नहीं बुलाया जाना चाहिए। किसी विधि को निष्पादित करने के लिए निर्धारित करने के लिए इच्छित कोई भी तर्क आप लिख सकते हैं।

फायदा और नुकसान

पेशेवरों
  • ASP.NET MVC कोड लिखने में आप पहले से ही बहुत अच्छे हैं, तो इससे आप अपने बैकग्राउंड कार्यों को उसी प्लेटफॉर्म पर लिख सकते हैं, जिसमें आप अपना बाकी का समाधान लिखते हैं।
  • कार्य आपके वेब ऐप के समान संदर्भ में चलते हैं, इसलिए आप कैश साझा कर सकते हैं और सहायक विधियों का उपयोग कर सकते हैं जो पहले से मौजूद हैं।
  • यदि आपने एक लोड-संतुलित यूआरआई प्राप्त किया है, तो आपके पृष्ठभूमि कार्य अब लोड-संतुलित हैं।
  • एक साथ तैनाती - आपको अपने वेब ऐप को अपने बैकग्राउंड टास्क लॉजिक के साथ सिंक करने की चिंता करने की ज़रूरत नहीं है, क्योंकि वे सभी एक ही तैनाती में हैं।
विपक्ष
  • वर्षों से, कुछ लोगों ने मुझे बताया है कि यह डिज़ाइन "अत्यधिक युग्मित" है, लेकिन जब दबाया जाता है तो वे स्पष्ट नहीं कर पाते हैं कि यह एक बुरी बात क्यों है।

नोट: यदि कोई प्रश्न या चिंता है, तो कृपया एक टिप्पणी जोड़ें । मैं विस्तार से खुश हूं।


7

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

मेरे पास एक अनुसूचित नौकरी भी है जो ASP.NET ऐप में एक यूआरएल को हिट करता है - यह एक सभ्य समाधान है लेकिन यह आपके द्वारा पिछले 1 वेब सर्वर के पैमाने पर मिनट को तोड़ना शुरू कर देता है।

वर्तमान में मैं दो अलग-अलग तरीकों का उपयोग करता हूं, दोनों Quartz.NET का उपयोग कर रहे हैं जो कि बहुत कम लाइब्रेरी है। पहला क्वार्ट्ज.नेट एएसपी.नेट के साथ इन-प्रोसेस चल रहा है, यह ग्लोबल.एक्सैक्स में सेटअप है और हर दो मिनट में चलता है। मैं ASP.NET कैश को बैंड से बाहर अपडेट करने के लिए इसका उपयोग करता हूं जो एकमात्र कारण है जो ASP.NET के भाग के रूप में चलाया जाता है।

दूसरा यह है कि मैंने DaemonMaster नामक Quartz.NET को लपेटने के लिए एक लाइब्रेरी लिखी है - यह एक DLL को एक डायरेक्टरी में छोड़ना आसान बनाता है और इसे विंडोज सर्विस में चलाया है। मैंने पाया कि यह विंडोज सर्विस के साथ काम करने के कुछ कष्टप्रद हिस्सों से बचने में मदद करता है और कुछ को क्वार्ट्ज.नेट एपी भी साफ करता है। डेमनमास्टर के माध्यम से चलने वाली सेवाएं दो अलग-अलग स्वादों की हैं, पहली ऐसी नौकरियां हैं जो हर रात या हर एक्स minuts चलाने की आवश्यकता होती हैं। अन्य कार्य ASP.NET अनुप्रयोग से आने वाले डेटा के आधार पर एक कतार से बाहर काम करते हैं। ASP.NET ऐप RabbitMQ पर JSON ऑब्जेक्ट्स को ड्राप करता है और सर्विसेस पोल RabbitMQ को डेटा को प्रोसेस करता है।

इसके आधार पर मैं आपको एक Windows सेवा के साथ जाने का सुझाव दूंगा (और DaemonMaster की जाँच करूँगा) और यदि आवश्यक हो तो ASP.NET ऐप से डेटा को सेवाओं तक पहुँचाने के लिए RabbitMQ जैसी कतार का उपयोग करें - यह इन सभी समाधानों में से सबसे अच्छा काम किया है । यदि आप कैश लोड कर रहे हैं तो ASP.NET में रनिंग करना समझ में आता है, अन्यथा मुझे नहीं लगता कि यह करता है।


6

मैं इसे सही तरीके से करना चाहता हूँ और एक Windows सेवा चल रही है जो एक "कतार" पर नज़र रखती है। मैं "कतार" कहता हूं क्योंकि प्रोग्रामिंग w / MSMQ आपके नेत्रगोलक में गर्म पोकर्स को जकड़ने के समान है।

मुझे देरी की सादगी से प्यार हो गया है :: रेल में नौकरी , और कुछ इसी तरह से आसानी से .NET में किया जा सकता है।

मूल रूप से आप किसी भी प्रकार का जोड़ते हैं SomethingOperation(कुछ ऐसा है जिसमें एक Perform()विधि है)। फिर बस संबंधित मापदंडों को क्रमबद्ध करें, इसे प्राथमिकता दें, कुछ प्रकार के डिफ़ॉल्ट रिट्रीट व्यवहार और इसे डेटाबेस में सामान करें।

आपकी सेवा बस इस पर नज़र रखेगी और कतार में काम करेगी।


प्रासंगिक मापदंडों को सीरियल करना वास्तव में "बस," लगभग "सब" नहीं है। अलग प्रक्रिया दृष्टिकोण के बारे में मेरे बड़े आरक्षणों में से एक ...
केविन मॉन्ट्रोस

हाँ, एक ही समाधान है जिसका मैंने उपयोग किया था, हालाँकि मैंने डेटाबेस में एक बाइनरी के रूप में पूरे ऑब्जेक्ट को क्रमबद्ध किया और फिर निष्पादित करने के लिए उन्हें बाहर निकाला। मैंने अपने सतत भंडारण और टास्क शेड्यूलर के रूप में कैसंड्रा का उपयोग कमांड लाइन ऐप के लिए मेरे CRON अनुसूचक के रूप में किया था जो कार्यों को चलाएगा और निष्पादित करेगा।
निक बेर्डी

हमने केवल संदेश में डेटा का एक साधारण टुकड़ा शामिल करके शुरू किया और पूरी वस्तु को फेंक दिया। यह अभी भी महान काम किया। मैं अलगाव पर विचार करूंगा क्योंकि इसके अन्य लाभ भी हैं।
नाथन पामर

@Kevin - यदि केवल हम कुछ लोगों को क्रमबद्धता इतिहास के बहुत सारे के साथ किया था ....
मार्क Gravell

4

हम सर्विस बस / संदेश कतार / सेवा के दृष्टिकोण से बहुत खुश हैं। बुनियादी वास्तुकला यह है।

वेबसाइट कतार में संदेश भेजती है

bus.Send(new ProjectApproved()); // returns immediately

Windows सेवा अपने समय में संदेश प्राप्त और संसाधित करती है

public class DoesSomethingAwesome : ConsumerOf<ProjectApproved>
{
   public void Consume(ProjectApproved Message)
   {
      // Do something "offline"
   }
}

फायदा यह है कि फ्रंट-एंड सर्विस के लिए कोई देरी नहीं है कि उपयोगकर्ता भी जुड़े हुए हैं। विंडोज़ सेवा को बंद किया जा सकता है और मुख्य साइट पर बिना किसी रुकावट के अपग्रेड किया जा सकता है। साथ ही यह बेहद तेज है

यदि आप अपने सभी डेटा को संदेश के भीतर संग्रहीत नहीं कर सकते हैं तो आप इसे हमेशा संग्रहीत कर सकते हैं और बाद में पुनः प्राप्त कर सकते हैं। : मैं इस तरह के रूप में एक दस्तावेज भंडारण तंत्र उपयोग करने का सुझाव RavenDB या MongoDB जहां यह बहुत सीधे आगे है बदलाव के बिना अपनी कक्षाओं स्टोर करने के लिए।

वेबसाइट कतार में संदेश भेजती है

// Save your object
store.Save(completeProject);

// Send a message indicating its ready to be processed
bus.Send(new ProjectApproved() { ProjectId = completeProject.Id });

Windows सेवा अपने समय में संदेश प्राप्त और संसाधित करती है

public class DoesSomethingAwesome : ConsumerOf<ProjectApproved>
{
   public void Consume(ProjectApproved Message)
   {
      // Retrieve your object back
      var completeProject = store.Get(Message.ProjectId);
   }
}

चीजों को सरल बनाने के लिए हम उपयोग करते हैं: राइनो ईएसबी और टॉपसेफ । कॉन्फ़िगरेशन बेहद सरल है और मौजूदा एप्लिकेशन के लिए इसे लगाने में बहुत कम समय लगता है।


वैसे भी, CQRS के साथ एक सेवा बस का उपयोग हमेशा अपने scalability में सुधार करने के लिए एक अच्छा तरीका है
thinkbeforecoding

3

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

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

मैं यह नहीं देखता कि नियमित अंतराल पर एक पृष्ठभूमि नौकरी क्यों चलती है जो एक आगंतुक की नकल नहीं कर सकती। अब मैं एक विंडोज प्रोग्रामर नहीं हूं, लेकिन लिनक्स की दुनिया में मैं एक क्रोन नौकरी स्थापित करता हूं जो एक नियमित अंतराल पर चलती है, और इसमें कोड की 2 लाइनें होंगी।

#!/bin/bash
wget -O /dev/null http://stackoverflow.com/specially_crafted_url

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

अपडेट करें

मुझे लगता है कि आप स्वयं वेब सर्वर पर नौकरी चलाने वालों को लोड संतुलन के मुद्दे के आसपास प्राप्त कर सकते हैं। नौकरी चलाने वाला किसी URL को नौकरी की कतार से बाहर निकालता है, और उसे इस तरह चलाता है:

wget -O /dev/null http://localhost/specially_crafted_url

जॉब / मैसेजिंग कतारों की प्रकृति के कारण, जॉब्स को समान रूप से जॉब रनर के बीच वितरित किया जाएगा, जिसका अर्थ है कि विशेष रूप से_एक्ड_url अंततः आपके वेब सर्वर के बीच वितरित किया जाता है।


हम पहले से ही हर उस चीज के लिए करते हैं जो पूर्वानुमेय अंतराल पर चलती है, जो हमारे पास बचा है वह ऐसी चीजें हैं जिनके बारे में बहुत पहले से भविष्यवाणी नहीं की जा सकती है। उदाहरण के लिए, "संबंधित प्रश्न ब्लॉक" केवल उन सवालों पर अपडेट किया गया है जिन्हें हाल ही में देखा गया है। इसी तरह से टैग किए गए प्रश्नों की सूची केवल तभी कैश की जाती है जब कोई उन टैगों की जांच करने के लिए परवाह करता है। चूंकि हम एक लाख से अधिक प्रश्न हैं, और 25k टैग्स के पास पहुंचकर हम सभी संबद्ध कार्यों को नहीं चला सकते हैं (और यह सिर्फ 2 उदाहरण हैं) "सिर्फ मामले में।"
केविन Montrose

लोड बैलेंस समस्याएं भी हैं, क्योंकि एसओ कई सर्वरों में विभाजित है। मूल रूप से, यदि आपको goto stackoverflow.com है तो आप हमेशा एक ही सर्वर से टकराएँगे। वाइज़ अप्रोच हमें एक सर्वर (या वास्तव में हमारे लोड बैलेंसिंग सेटअप को फिर से काम करने) के लिए सभी कार्यों को मार्शल करने के लिए मजबूर करेगा, जो वास्तव में दर्दनाक होगा।
केविन Montrose

अच्छा हो अगर चीजें नियमित अंतराल पर चले, हालांकि, है ना? मुझे समझ में आ रहा है कि आप क्या कह रहे हैं, लेकिन ऊपर उल्लिखित कार्यप्रणाली (और मुझे लगता है कि कुछ अन्य लोगों द्वारा उल्लिखित) में बदलाव नहीं होता है। जब एक पृष्ठ दृश्य कहता है "यह नौकरी चलाने का समय है", तो आप नौकरी को एक संदेश कतार में चिपका देते हैं। लंबे समय तक चलने वाला बैकग्राउंड जॉब उसे मिलने वाली नौकरियों को चलाता है। इस मामले में नौकरियां यूआरएल से अधिक कुछ नहीं हैं जिन्हें अनुरोध करने की आवश्यकता है। hehe आप इसे $ 20 एक महीने के साझा सर्वर पर सेट कर सकते हैं, क्योंकि इसे चलाने के लिए आपके कोड आधार की आवश्यकता नहीं है। मैसेजिंग सर्विस का आसान उपयोग करने के लिए अमेज़न SQS पर एक नज़र डालें।
मोलसून

शेष राशि के मुद्दों के बारे में। जहा चाह वहा राह! Stackoverflow.com पर अनुरोध करने के बजाय, आप IP पते का उपयोग करके किसी सर्वर को यादृच्छिक रूप से हिट कर सकते हैं। अगर लोड बैलेंसर पाइप अनुरोधों के लिए कुकीज़ की जांच करता है, तो आप कुकीज़ नकली कर सकते हैं। यदि यह आईपी पते की जांच करता है, तो आप शायद नकली भी हो सकते हैं (क्योंकि आप सर्वर से प्रतिक्रिया की परवाह नहीं करते हैं)।
मोलसून

बैलेंस लोड करने पर सहमत होना ऐसा करने का एक कारण होना चाहिए । चूंकि specially_crafted_urlएक ज्ञात आईपी से अनुरोध आ रहा है, आप उस आईपी के लिए केवल राउंड-रॉबिन करने के लिए अपने लोड बैलेंसर पर एक नियम जोड़ सकते हैं।
पोर्टमैन

2

मुझे लगता है कि शुद्ध सेवा दृष्टिकोण के साथ चुनाव है कि आपके पास कोड सेवा में बिखरे हुए हैं और कोर ऐप से दूर हैं।

यहां हमने बड़ी पृष्ठभूमि वाली गैर-संवेदनशील नौकरियों के साथ काम किया है, जो कोड को एक साथ रखता है और सेवा को सरल बनाता है:

  1. नौकरियों की कतार बनाएं (या तो मेमोरी या डीबी में, नौकरियों के प्रकारों के लिए जो भी दृढ़ता की आवश्यकता है)
  2. एक वेब सेवा बनाएं जो कतारबद्ध नौकरियों को निष्पादित करेगी
  3. मृत सरल सेवा ऐप जो एक निर्दिष्ट अंतराल पर वेब सेवा को कॉल करता है, अपने कोर कोडबेस में वेब सेवा के लिए सभी जटिल सामान (नौकरी पुनर्प्राप्ति और निष्पादन) छोड़ दें।

और भी सरल, बस एक कंसोल ऐप में कॉल करें और इसे "सेवा" में बदलने के लिए टास्क शेड्यूलर या विजुअलक्रॉन का उपयोग करें।


1
मुझे काम पर एक महत्वपूर्ण एप्लिकेशन में यह बिल्कुल मिला है - एक विंडोज सेवा जो अंतराल पर वेब ऐप को ट्रिगर करती है। वेब एप्लिकेशन स्टेटस रहित रहता है, आवश्यकतानुसार डेटाबेस से स्थिति को खींचता है। एक इलाज करता है।
बेवन

1

मुझे TopShelf पसंद आया। सरलता रखता है, फिर भी इसे विंडोज सेवा के रूप में चलाने का उचित तरीका है। मूल रूप से एक कंसोल ऐप बनाते हैं, लगभग 15-20 लाइनों के कोड जोड़ते हैं, फिर यह एक सेवा के रूप में स्थापित होता है।

http://code.google.com/p/topshelf/


1

वेब सर्वर पर चलने वाली एक बहुत ही सरल विंडोज सेवा के बारे में और समय-समय पर एक रखरखाव URL को हिट करता है जो आपके विविध कार्यों को करता है। क्या यह थ्रॉटल है कि यह किसी भी अनुरोध में कितना काम करता है।


1

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

  • निगरानी के लिए कोई बाहरी सेवा नहीं
  • कार्यान्वयन की सादगी: कोई क्रॉस-प्रोसेस मार्शालिंग, कोई उन्नत नौकरी की निगरानी नहीं
  • आप अभी भी अपनी IIS प्रक्रिया के अंदर हैं, इसलिए आप अपने सभी सामान्य लॉगिंग और इतने पर कर सकते हैं (एकाधिक लॉग फ़ाइलों की कोई आवश्यकता नहीं)
  • बेहद सरल तैनाती (जब आप किसी सेवा को अपडेट करते हैं, तो आपको सेवा को रोकना होगा, फ़ाइलों को कॉपी करना होगा, सेवा शुरू करनी होगी - यह वेबसाइट कोड के लिए आपके सामान्य अपडेट के अतिरिक्त है)

मेरी राय में, एक इन-आईआईएस समाधान बस बेतरतीब पृष्ठ दृश्यों पर काम को गुल्लक करने से "अगला कदम" है।


1

रेसक्यू अच्छा है। या यहां तक ​​कि Kthxbye यदि आपको पूरा होने के बाद परिणामी मूल्य के बारे में सूचित करने की आवश्यकता है।

दोनों रेडिस / रूबी आधारित थ।

ईमानदारी से, यदि आप एक सेवा-आधारित दृष्टिकोण कर रहे हैं, तो यह वास्तव में आपके वर्तमान मंच के साथ सुपर-एकीकृत होने की आवश्यकता नहीं है, जो मुझे लगता है कि एक प्लस है। मुझे उम्मीद है कि यह एक सेट-एंड-भूल प्रणाली हो सकती है जो किसी प्रकार की निगरानी के साथ चलेगी और पूरी तरह से नौकरी देगी। मुझे यकीन नहीं है कि इसे सिर्फ एक ही प्लेटफॉर्म पर चलाने की जरूरत है क्योंकि इसकी डेटाबेस अपडेटिंग / जानकारी को संशोधित करना है।

यकीन है कि अगर आप इस थोड़े काम को एक अलग इकाई के रूप में करते हैं, तो बहुत कम के लिए बहुत दूर निकल सकते हैं, खासकर जब से ऐसा लगता है कि आप थ्रेडिंग मुद्दों से निपट रहे हैं। दोनों Resque और निजता सार्वजनिक ओएस संगामिति को संभालने के लिए अनुमति देने के लिए अलग-अलग प्रक्रियाओं के लिए बाहर ले जाने के प्रसंस्करण।

Resque

निजता सार्वजनिक


मुझे Kthxbye की कोशिश करनी चाहिए यदि केवल महान नाम के कारण!
नाथन पामर

बहुत बढ़िया। अगले ORLY होगा? पुस्तकालय। शायद किसी तरह के आँकड़ों की निगरानी के लिए ...;)
लुकास

0

मैं एक MSMQ कतार सुनकर WAS होस्टेड WCF सेवा का उपयोग करूंगा।

प्रो की

  • फायर करें और वेब ऐप से एक तरह से संदेश भूल जाएं

  • MSMQ / WCF थ्रॉटलिंग और पुनः प्रयास करें

  • गारंटी वितरण; डी

  • मृत पत्र प्रबंधन

  • वितरित प्रसंस्करण

  • WAS / MSMQ सक्रियण

कोन के

  • MSMQ (यह मृत नहीं है ... फिर भी)

WCF में MSMQ सुविधाएँ MSMQ का उपयोग वास्तव में अच्छा करती हैं। हाँ, आप कॉन्फ़िगरेशन पर खून बहाना होगा लेकिन लाभ बलिदान से आगे निकल जाएगा।


0

वेब एप्लिकेशन विकसित करते समय मैंने इसे एक-दो बार चलाया है। हम इसे एक विंडो कंसोल एप्लिकेशन बनाकर हल कर रहे हैं जो कार्य को करता है, और एक शेड्यूल किए गए कार्य को बनाता है जो वास्तव में कार्य करने के लिए हर बार चलता है।


0

आप Rx और निम्न जैसे कुछ का उपयोग करके एक बैकग्राउंड थ्रेड (या कई बैकग्राउंड थ्रेड) पर काम कर सकते हैं:

var scheduler = new EventLoopScheduler( SchedulerThreadName );
_workToDo = new Subject<Action>();
var queueSubscription = _workToDo.ObserveOn( scheduler ).Subscribe( work => work() );
_cleanup = new CompositeDisposable( queueSubscription, scheduler );

काम में लाना:

var work = () => { ... };
_workToDo.OnNext( work ); // Can also put on error / on complete in here

एक वर्ग के अंदर सभी को होस्ट करें कि केवल एक (उर्फ एक सिंगलटन है, लेकिन इसे ठीक से करें - जीवन शैली निर्धारित करने के लिए आईओसी कंटेनर का उपयोग करें)।

आप EventLoopScheduler (जो एक एकल थ्रेड चलाता है) का उपयोग करने के स्थान पर एक कस्टम शेड्यूलर लिखकर थ्रेड पूल आदि के आकार को नियंत्रित कर सकते हैं।


0

मैंने इस तरह की बात को कुछ समय के लिए लागू किया है। खिड़कियों पर, मैं एक अजगर कमांड-लाइन प्रोग्राम सेट करता हूं जो कई बार कुछ करता है। यह प्रोग्राम एक पोर्ट पर xmlrpc इंटरफ़ेस भी उजागर करता है। फिर, एक शेड्यूल किया गया कार्य हर मिनट चलता है और xmlrpc इंटरफ़ेस पर प्रश्न करता है। यदि वे नहीं हैं, तो यह उन्हें लॉन्च करने की कोशिश करता है। यदि ऐसा नहीं हो सकता है, तो यह मुझे ईमेल करता है।

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

और एक ही प्रणाली छोटे संशोधनों के साथ यूनिक्स पर काम करती है।


0

मेरे पास आपके लिए खुद का जवाब नहीं है, लेकिन समस्या एक घंटी बजाती है - मुझे याद है कि कुछ यादृच्छिक लोगों ने एक बार पॉडकास्ट पर चर्चा की थी

स्पोलस्की: मैंने ब्लॉग पर आपके द्वारा पूछे गए प्रश्नों में से एक पर ध्यान दिया है कि आपको सामान्य रूप से रखरखाव के आवर्ती कार्यों को कैसे संभालना चाहिए?

Atwood: हाँ।

Spolsky: यह एक उचित लक्षण वर्णन है? हर वेबसाइट के कुछ कार्य होते हैं जिन्हें आप उस समय निष्पादित नहीं करना चाहते जब कोई वेब पेज लोड हो रहा हो, लेकिन आप किसी प्रकार की पुनरावृत्ति के साथ निष्पादित करना चाहते हैं।

Atwood: हां, पृष्ठभूमि कार्यों की तरह बात।

Spolsky: हां, तो आपने क्या पता किया?

एटवुड: ठीक है, मैंने मूल रूप से ट्विटर पर पूछा, क्योंकि मुझे बस कुछ हल्का वजन चाहिए था। मैं वास्तव में एक विंडोज़ सेवा लिखना पसंद नहीं करना चाहता था। मुझे ऐसा लग रहा था कि मैं बैंड कोड से बाहर हूं। प्लस जो कोड वास्तव में काम करता है वह वास्तव में एक वेब पेज है, क्योंकि मेरे लिए एक वेबसाइट पर काम करने की तार्किक इकाई एक वेब पेज है। तो, यह वास्तव में ऐसा है जैसे हम वेब साइट में वापस कॉल कर रहे हैं, यह वेबसाइट में एक अन्य अनुरोध की तरह है, इसलिए मैंने इसे कुछ ऐसा देखा जिसे इनलाइन रहना चाहिए, और थोड़ा दृष्टिकोण जो हम आए थे, जिसकी सिफारिश मुझे ट्विटर पर की गई थी। अनिवार्य रूप से एक निश्चित समाप्ति के साथ एप्लिकेशन कैश में कुछ जोड़ने के लिए था, तो आपके पास एक कॉल बैक होता है, ताकि जब यह समाप्त हो जाए तो यह एक निश्चित फ़ंक्शन को कॉल करता है जो काम करता है फिर आप इसे उसी समाप्ति के साथ कैश में वापस जोड़ते हैं।


1
हाँ, जो कि StackOverflow की तुलना में बहुत छोटी साइटों के लिए काम करता है। स्केल यहां एक बड़ा मुद्दा है, दुर्भाग्य से (या सौभाग्य से, आप इसे कैसे देखते हैं, इस पर निर्भर करता है)।
केविन Montrose

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

आपके विशेष सुझाव (कैश एक्सपायरी वन) का कोई पैमाना नहीं है क्योंकि सभी कैश एक्सपायरेशन (ASP.NET में) एक ही थ्रेड को चलाते हैं (यह छोटी साइटों के लिए एक चतुर हैक है, जैसे एसओ हुआ करता था)। एक क्रोन कार्य स्केल नहीं करता है क्योंकि हमने एक ही सर्वर को आगे बढ़ाया है (SO अब 3 है, और अभी भी बढ़ रहा है) और किसी भी क्रोन कार्य को एक ही सर्वर से टकराना होगा (कम से कम, यह बदलते हुए कि हमारे लोड के साथ वास्तव में दर्दनाक होगा- संतुलन सेटअप)। क्रोन कार्य को भी वास्तव में अक्सर चलाना होगा, क्योंकि ये कार्य मिनटों के क्रम पर आवर्ती होते हैं।
केविन Montrose

यह ध्यान देने योग्य है कि हम "क्रोन शैली" का उपयोग कम बार चलाने, निश्चित अंतराल, पहले से ही कार्य, बिल्ला अनुदान और दैनिक ई-मेल नोटिस जैसी चीजों के लिए करते हैं।
केविन Montrose

0

टास्क कतार जावा एपीआई अवलोकन

टास्क कॉन्सेप्ट्स
इन एप इंजन बैकग्राउंड प्रोसेसिंग, एक कार्य एक छोटी इकाई का पूरा विवरण है। इस विवरण में दो भाग हैं:

  • एक डेटा पेलोड जो कार्य को मापता है।
  • कोड जो कार्य को कार्यान्वित करता है।

ऑफ़लाइन वेब हुक के रूप में कार्य
सौभाग्य से, इंटरनेट एक HTTP अनुरोध और इसकी प्रतिक्रिया के रूप में इस तरह का समाधान पहले से ही प्रदान करता है। डेटा पेलोड HTTP अनुरोध की सामग्री है, जैसे कि वेब फॉर्म चर, XML, JSON, या एन्कोडेड बाइनरी डेटा। कोड संदर्भ URL ही है; वास्तविक कोड वह कोई भी तर्क है जो सर्वर प्रतिक्रिया को तैयार करने में निष्पादित करता है।


मैं GAE कार्य कतार एपीआई का उपयोग करने का सुझाव नहीं दे रहा हूं, लेकिन उनके मॉडल का पालन कर रहा हूं। उन्होंने कुछ समय के लिए इसके बारे में सोचा और इसके कार्यान्वयन को लिखा।
एंटनी.ट्रुप

0

दोनों करो

प्रश्न पथ के लिए एक वैकल्पिक पैरामीटर जोड़ें जो उस कार्य को करता है जो आप वर्तमान में उपयोगकर्ता के अनुरोधों पर कर रहे हैं:

एक बड़ी साइट पर पृष्ठभूमि कार्यों की सेवा

एक कंसोल ऐप बनाएं जो प्रत्येक सर्वर पर चलता है और IIS लॉग साझा किए गए बाइनरी को खोलता है और इसे फ़ाइल के वर्तमान छोर पर पढ़ता है। IIS को लॉग फ्लश करने के लिए अपडेट एकत्र करने के लिए आगे पढ़ने के लिए एक फाइलसिस्टम वॉच या एक समय अंतराल का उपयोग करें।

वर्तमान में क्या पृष्ठ देखे गए हैं, यह निर्धारित करने के लिए इस जानकारी का उपयोग करें।

वेबलॉग ऑब्जेक्ट के साथ लोकलहोस्ट पर url के "एक्स्ट्रास्टाफ" संस्करण को कॉल करने के लिए पार्स किए गए लॉग से पेज यूआरएल का उपयोग करें।

प्रत्येक लॉग अवधि के अंत में फ़ाइलों को स्विच करने के लिए कुछ कोड में जोड़ें या प्रत्येक लॉग अवधि की प्रक्रिया को पुनरारंभ करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.