ASP.NET Core में बैकग्राउंड टास्क कैसे चलाएँ

परिचय

फ़ाइल प्रसंस्करण (उदाहरण के लिए, प्रस्तुति को PDF में निर्यात करना) एक सामान्य सर्वर‑साइड कार्य है। इसे अनुरोध हैंडलर के अंदर (जब क्लायंट प्रतीक्षा करता है) निष्पादित करने से निम्नलिखित नुक़सान होते हैं:

  • खराब UI. पृष्ठ फ्रीज़ हो जाता है और उपयोगकर्ता को परिणाम का इंतजार करना पड़ता है। पृष्ठ को पुनः लोड करने से कार्य रद्द हो जाता है।
  • ऑपरेशन टाइमआउट. हम यह सुनिश्चित नहीं कर सकते कि प्रसंस्करण निश्चित समय में पूरा हो जाएगा, इसलिए उपयोगकर्ता को संभवतः “ऑपरेशन टाइमआउट” दिखाई देगा।
  • कम थ्रूपुट और स्केलेबिलिटी. ASP.NET Core को कई अनुरोधों को असिंक्रोनस रूप से प्रोसेस करने के लिए डिज़ाइन किया गया है। CPU‑बाउंड, दीर्घकालिक कार्य थ्रेड्स को ब्लॉक करते हैं और सर्वर थ्रूपुट को घटाते हैं।
  • खराब फॉल्ट टॉलरेंस. यदि दीर्घकालिक कार्य के दौरान कुछ गलत हो जाता है (उदाहरण के लिए, कनेक्टिविटी समस्या), तो प्रसंस्करण विफल हो जाता है और शुरू से पुनः शुरू करना पड़ता है।

एक बेहतर तरीका है कि जॉब को असिंक्रोनस रूप से शेड्यूल किया जाए, पृष्ठभूमि में प्रोसेस किया जाए, और परिणाम तैयार होने पर लौटाया जाए।

इस मॉडल में, उपयोगकर्ता वर्तमान स्थिति देख सकता है (और पृष्ठ छोड़ या पुनः लोड कर सकता है), सर्वर संसाधनों को कुशलतापूर्वक स्केल और लचीले ढंग से ट्यून किया जा सकता है, और एक रीट्राई नीति लागू की जा सकती है।

एक सामान्य बैकग्राउंड‑प्रोसेसिंग समाधान शामिल करता है:

  1. जॉब को शेड्यूल करने के लिए API।
  2. जॉब स्थिति को ट्रैक करने के लिए API।
  3. शेड्यूल किए गए जॉब को प्रोसेस करने के लिए बैकग्राउंड वर्कर।
  4. परिणाम को संग्रहीत और पुनः प्राप्त करने के लिए API।

बैकग्राउंड टास्क उदाहरण

इस विधि को दर्शाने के लिए, sample ASP.NET Core 3.1 web application पर विचार करें। एप्लिकेशन में एक पृष्ठ शामिल है जहाँ उपयोगकर्ता प्रस्तुति अपलोड कर सकता है और Export to PDF पर क्लिक कर सकता है; प्रस्तुति तब अपलोड होकर बैकग्राउंड वर्कर द्वारा PDF में परिवर्तित हो जाती है।

वेब ऐप

  • फ़ाइल अपलोड पेज (Razor पेज “Upload”)।
  • प्रोग्रेस पेज (Razor पेज “Progress” कुछ JavaScript फ़ंक्शन के साथ जो स्थिति जाँचते और प्रदर्शित करते हैं)।
  • Controller (JobStatusController) जो प्रसंस्करण स्थिति प्रदान करता है (api/status/{jobId})।
  • Controller (JobResultController) जो एक्सपोर्ट की गई PDF फ़ाइल लौटाता है (api/result/{id})।
  • ASP.NET Core होस्टिंग सेवा पर आधारित बैकग्राउंड वर्कर (WorkerService क्लास देखें)।

Razor पेज, कंट्रोलर, और बैकग्राउंड वर्कर वास्तविक कार्य को BackgroundJobDemo.Common प्रोजेक्ट में परिभाषित इंटरफ़ेस के माध्यम से डेलीगेट करते हैं। जॉब प्रबंधन और प्रसंस्करण के ठोस कार्यान्वयन अलग‑अलग प्रोजेक्ट (BackgroundJobDemo.Local, BackgroundJobDemo.Aws, आदि) में प्रदान किए जाते हैं और Startup.ConfigureServices मेथड में स्विच किए जा सकते हैं।

डेमो उद्देश्यों के लिए, “Upload” पेज बफ़र्ड मॉडल बाइंडिंग का उपयोग करता है, लेकिन बड़े फ़ाइल अपलोड्स के लिए अनबफ़रड स्ट्रीमिंग सिफ़ारिश की गई है। प्रोडक्शन के लिए संबंधित सुरक्षा पहलू पर विचार करें। “Progress” पेज जावास्क्रिप्ट के माध्यम से हर दो सेकंड में शेड्यूल किए गए जॉब की स्थिति को पोल करता है (यह अंतराल कॉन्फ़िगर किया जा सकता है)। पोलिंग सामान्य है, लेकिन अधिक उन्नत परिदृश्यों में आपको WebSockets के माध्यम से रियल‑टाइम नोटिफिकेशन की आवश्यकता हो सकती है (रियल‑टाइम कम्यूनिकेशन इस लेख के दायरे से बाहर हैं)। SignalR रियल‑टाइम कम्यूनिकेशन के लिए एक सरल लेकिन शक्तिशाली टूल है।

सर्वर प्रक्रिया में बैकग्राउंड वर्कर को होस्ट करना सरल एप्लिकेशन के लिए सुविधाजनक है लेकिन इसमें कमियों हैं। एक अधिक दृढ़ और स्केलेबल दृष्टिकोण वर्कर को अलग प्रक्रिया में डिप्लॉय करना है (उदा., BackgroundJobDemo.Worker कंसोल एप्लिकेशन देखें)।

बुनियादी कार्यान्वयन

BackgroundJobDemo.Local प्रोजेक्ट SQLite डेटाबेस का उपयोग करके एक साधारण जॉब‑मैनेजमेंट कार्यान्वयन प्रदान करता है (डेटाबेस पाथ LocalConfig.DbFilePath के माध्यम से कॉन्फ़िगर किया जाता है; Startup.ConfigureServices देखें)। अपलोड की गई और प्रोसेस की गई फ़ाइलें फ़ाइल सिस्टम में संग्रहित होती हैं (स्टोरेज फ़ोल्डर पाथ LocalConfig.FileStorageFolderPath के माध्यम से कॉन्फ़िगर किया जाता है; Startup.ConfigureServices देखें)। वास्तविक विश्व अनुप्रयोगों में बेहतर फॉल्ट टॉलरेंस और प्रदर्शन के लिए जॉब शेड्यूलिंग को संदेश कतारों (जैसे RabbitMQ, AWS SQS, Azure Storage Queue) के माध्यम से लागू किया जाना चाहिए।

Amazon Web Services पर आधारित वितरित कार्यान्वयन

BackgroundJobDemo.Aws प्रोजेक्ट Amazon Web Services पर जॉब प्रोसेसिंग को लागू करता है और क्षैतिज रूप से स्केलेबल वितरित आर्किटेक्चर प्रदर्शित करता है। इसमें निम्नलिखित घटक शामिल हैं:

  • वेब ऐप — उपयोगकर्ता के साथ इंटरैक्ट करता है और PPTX‑to‑PDF एक्सपोर्ट कार्य आदि को शेड्यूल करता है।
  • वर्कर — एक्सपोर्ट्स को प्रोसेस करता है (इन‑प्रोसेस, आउट‑ऑफ़‑प्रोसेस, या AWS Lambda)।
  • मैसेज क्व्यू — प्रोसेस किए जाने वाले कार्यों को संग्रहित करता है (Amazon SQS)।
  • फ़ाइल स्टोरेज — अपलोड की गई और प्रोसेस की गई फ़ाइलों को संग्रहित करता है (Amazon S3)।
  • की‑वैल्यू स्टोर — कार्य प्रोसेसिंग स्थिति को ट्रैक करता है (Amazon DynamoDB)।

एक सामान्य वितरित आर्किटेक्चर संदेश कतारें पर निर्भर करता है: वेब ऐप बैकग्राउंड टास्क को कतार में डालता है; एक बैकग्राउंड वर्कर कतार से टास्क को पुनः प्राप्त करता है और आवश्यक कार्य करता है। यह घटकों को डिस्कपल करता है और प्रोसेसिंग को असिंक्रोनस और भरोसेमंद बनाता है। कतार डिलीवरी की गारंटी देती है और visibility timeout का उपयोग करती है: जब एक वर्कर संदेश लेता है तो वह अन्य वर्करों के लिए अदृश्य हो जाता है; केवल प्रोसेसिंग वर्कर पूर्णता पर इसे हटाता है। यदि प्रोसेसिंग visibility timeout के भीतर समाप्त नहीं होती (उदा., विफलता या नेटवर्क समस्या के कारण), तो अनप्रोसेस्ड संदेश फिर से दृश्यमान हो जाता है।

हमारा कार्यान्वयन Amazon Simple Queue Service (SQS) का उपयोग करता है, जो माइक्रोसर्विसेज, वितरित सिस्टम और सर्वरलेस एप्लिकेशन के लिए पूर्ण रूप से प्रबंधित संदेश कतार है।

संदेश कतारें हल्के संदेशों के लिए बनी हैं (उदा., SQS संदेश आकार सीमा 256 KB है), इसलिए एक संदेश में केवल कार्य विवरण होना चाहिए। भारी डेटा (जैसे प्रोसेस की जाने वाली फ़ाइलें) को अलग से संग्रहीत किया जाना चाहिए और संदेश से संदर्भित किया जाना चाहिए। Amazon S3 का उपयोग अपलोड की गई और प्रोसेस की गई फ़ाइलों को संग्रहीत करने के लिए किया जाता है।

ID द्वारा जॉब परिणामों को स्थायी रूप से संग्रहीत और पुनः प्राप्त करने के लिए एक की‑वैल्यू स्टोर की आवश्यकता होती है। उदाहरण में Amazon DynamoDB का उपयोग किया गया है, जो एक तेज़ और लचीला NoSQL डेटाबेस सेवा है।

Amazon Web Services के साथ डेमो ऐप चलाने के लिए:

  1. उसी AWS क्षेत्र में, बनाएं और कॉन्फ़िगर करें:
    1. एक SQS क्व्यू,
    2. एक S3 बकेट,
    3. एक DynamoDB तालिका।
  2. वेब ऐप को इन सेवाओं से जोड़ें Startup.ConfigureServices में AddAws को कॉल करके, SQS क्व्यू URL, S3 बकेट नाम, DynamoDB तालिका नाम, और AWS क्षेत्र प्रदान करके।

संदर्भ