अपने पिछले लेख में, मैंने SQL सर्वर में सर्विस ब्रोकर का उपयोग करके एसिंक्रोनस प्रोसेसिंग को लागू करने के लाभों के बारे में बात की थी, जो लंबे कार्यों के डिकॉउल्ड प्रोसेसिंग के लिए मौजूद अन्य तरीकों पर मौजूद हैं। इस लेख में, हम उन सभी घटकों के बारे में जानेंगे जिन्हें एक डेटाबेस में एक बुनियादी सेवा ब्रोकर कॉन्फ़िगरेशन के लिए कॉन्फ़िगर करने की आवश्यकता है, और ब्रोकर सेवाओं के बीच वार्तालाप प्रबंधन के लिए महत्वपूर्ण विचार। आरंभ करने के लिए, हमें एक डेटाबेस बनाना होगा और सेवा ब्रोकर के उपयोग के लिए डेटाबेस को सक्षम करना होगा:
डेटाबेस AsyncProcessingDemo बनाएं;जाओ अगर (sys.databases से is_broker_enabled चुनें जहां नाम =N'AsyncProcessingDemo') =0BEGIN ALTER DATABASE AsyncProcessingDemo SET ENABLE_BROKER;ENDGO USE AsyncProcessingDemo;GOब्रोकर घटकों को कॉन्फ़िगर करना
डेटाबेस में बनाए जाने वाले मूल ऑब्जेक्ट संदेशों के लिए संदेश प्रकार हैं, एक अनुबंध जो परिभाषित करता है कि संदेशों को सेवाओं, एक कतार और आरंभकर्ता सेवा, और एक कतार और लक्ष्य सेवा के बीच कैसे भेजा जाएगा। सर्विस ब्रोकर के लिए ऑनलाइन कई उदाहरण सर्विस ब्रोकर के लिए संदेश प्रकार, अनुबंध और सेवाओं के लिए जटिल ऑब्जेक्ट नामकरण दिखाते हैं। हालांकि, नामों के जटिल होने की आवश्यकता नहीं है, और किसी भी ऑब्जेक्ट के लिए साधारण ऑब्जेक्ट नामों का उपयोग किया जा सकता है।
संदेशों के लिए, हमें अनुरोध के लिए एक संदेश प्रकार बनाना होगा, जिसे
AsyncRequest
कहा जाएगा , और परिणाम के लिए एक संदेश प्रकार, जिसेAsyncResult
. कहा जाएगा . दोनों एक्सएमएल का उपयोग करेंगे जो कि सेवाओं के लिए आवश्यक डेटा भेजने और प्राप्त करने के लिए ब्रोकर सेवाओं द्वारा सही ढंग से गठित के रूप में मान्य होगा।-- संदेश प्रकार बनाएं संदेश प्रकार बनाएं [AsyncRequest] सत्यापन =WELL_FORMED_XML; संदेश प्रकार बनाएं [AsyncResult] सत्यापन =WELL_FORMED_XML;अनुबंध निर्दिष्ट करता है कि
AsyncRequest
आरंभिक सेवा द्वारा लक्ष्य सेवा को भेजा जाएगा और लक्ष्य सेवा एकAsyncResult
लौटाएगी दीक्षा सेवा पर वापस संदेश। अनुबंध आरंभकर्ता और लक्ष्य के लिए कई संदेश प्रकार भी निर्दिष्ट कर सकता है, या विशिष्ट संदेश प्रकार को किसी भी सेवा द्वारा भेजा जा सकता है, यदि विशिष्ट प्रसंस्करण के लिए इसकी आवश्यकता होती है।-- अनुबंध बनाएं अनुबंध बनाएं [AsyncContract] ( [AsyncRequest] प्रारंभकर्ता द्वारा भेजा गया, [AsyncResult] लक्ष्य द्वारा भेजा गया);प्रत्येक सेवा के लिए, सेवा द्वारा प्राप्त संदेशों का भंडारण प्रदान करने के लिए एक कतार बनाई जानी चाहिए। जिस लक्ष्य सेवा में अनुरोध भेजा जाएगा उसे
AsyncContract
. निर्दिष्ट करते हुए बनाने की आवश्यकता है सेवा को संदेश भेजने की अनुमति देने के लिए। इस मामले में सेवा का नामProcessingService
. रखा गया है औरProcessingQueue
. पर बनाया जाएगा डेटाबेस के भीतर। आरंभ करने वाली सेवा को अनुबंध निर्दिष्ट करने की आवश्यकता नहीं है, जो इसे केवल उस वार्तालाप के जवाब में संदेश प्राप्त करने में सक्षम बनाता है जो इससे शुरू किया गया था।-- प्रोसेसिंग कतार और सेवा बनाएं - सेवा को भेजने की अनुमति देने के लिए अनुबंध निर्दिष्ट करेंक्यूईईईई प्रोसेसिंगक्यू बनाएं;क्यूईयूई प्रोसेसिंगक्यू पर सेवा बनाएं [प्रसंस्करणसेवा]([AsyncContract]); - अनुरोध कतार बनाएं और सेवा कतार अनुरोध कतार बनाएं; कतार अनुरोध कतार पर सेवा बनाएं [अनुरोध सेवा];संसाधन के लिए संदेश भेजना
जैसा कि मैंने पिछले लेख में बताया था, मैं ब्रोकर सेवा को एक नया संदेश भेजने के लिए एक रैपर संग्रहित प्रक्रिया को लागू करना पसंद करता हूं, ताकि आवश्यकता पड़ने पर प्रदर्शन को मापने के लिए इसे एक बार संशोधित किया जा सके। यह प्रक्रिया एक नया वार्तालाप बनाने और
ProcessingService
को संदेश भेजने के लिए एक सरल आवरण है ।-- संदेश भेजने के लिए रैपर प्रक्रिया बनाएं प्रक्रिया dbo.SendBrokerMessage @FromService SYSNAME, @ToService SYSNAME, @Contract SYSNAME, @MessageType SYSNAME, @MessageBody XMLASBEGIN SET NOCOUNT ON; DECLARE @conversation_handle UNIQUEIDENTIFIER; लेनदेन शुरू करें; संवाद बातचीत शुरू करें @conversation_handle सेवा से @ सेवा से सेवा तक @ सेवा पर अनुबंध @ एन्क्रिप्शन के साथ अनुबंध =बंद; बातचीत पर भेजें @conversation_handle संदेश प्रकार @MessageType(@MessageBody); प्रतिबद्ध लेनदेन;ENDGOरैपर संग्रहीत कार्यविधि का उपयोग करके अब हम
ProcessingService
. को एक परीक्षण संदेश भेज सकते हैं यह सत्यापित करने के लिए कि हमने ब्रोकर सेवाओं को सही तरीके से स्थापित किया है।-- एक अनुरोध भेजेंEXECUTE dbo.SendBrokerMessage @FromService =N'RequestService', @ToService =N'ProcessingService', @Contract =N'AsyncContract', @MessageType =N'AsyncRequest', @MessageBody =N'<खाता संख्या>12345खाता संख्या> '; - प्रोसेसिंग क्यू पर संदेश की जांच करें, प्रोसेसिंग क्यू से CAST(message_body AS XML) का चयन करें;जाओसंदेश संसाधित किया जा रहा है
जबकि हम
ProcessingQueue
. से संदेशों को मैन्युअल रूप से संसाधित कर सकते थे , हम शायद चाहते हैं कि संदेशों को स्वचालित रूप से संसाधित किया जाए क्योंकि वेProcessingService
को भेजे जाते हैं . ऐसा करने के लिए एक सक्रियण संग्रहीत कार्यविधि बनाने की आवश्यकता है जिसका हम परीक्षण करेंगे और फिर बाद में कतार सक्रियण पर प्रसंस्करण को स्वचालित करने के लिए कतार से जुड़ जाएंगे। किसी संदेश को संसाधित करने के लिए हमेंRECEIVE
. की आवश्यकता होती है संदेश के लिए संदेश प्रकार और वार्तालाप हैंडल के साथ लेन-देन के भीतर कतार से संदेश। संदेश प्रकार यह सुनिश्चित करता है कि संसाधित किए जा रहे संदेश पर उचित तर्क लागू किया गया है, और वार्तालाप हैंडल संदेश संसाधित होने पर प्रतिक्रिया को आरंभ करने वाली सेवा को वापस भेजने की अनुमति देता है।
RECEIVE
कमांड एक ही संदेश या एक ही वार्तालाप हैंडल या समूह के भीतर एक से अधिक संदेशों को एक ही लेन-देन में संसाधित करने की अनुमति देता है। एकाधिक संदेशों को संसाधित करने के लिए, एक तालिका चर का उपयोग किया जाना चाहिए, या एकल संदेश प्रसंस्करण करने के लिए, एक स्थानीय चर का उपयोग किया जा सकता है। नीचे दी गई सक्रियण प्रक्रिया कतार से एक संदेश प्राप्त करती है, यह निर्धारित करने के लिए संदेश प्रकार की जांच करती है कि यह एकAsyncRequest
है या नहीं संदेश, और फिर प्राप्त संदेश जानकारी के आधार पर लंबी चलने वाली प्रक्रिया करता है। यदि इसे लूप के भीतर कोई संदेश प्राप्त नहीं होता है, तो यह लूप से बाहर निकलने और इसके निष्पादन को समाप्त करने से पहले किसी अन्य संदेश के लिए कतार में प्रवेश करने के लिए 5000ms, या 5 सेकंड तक प्रतीक्षा करेगा। किसी संदेश को संसाधित करने के बाद, यह एकAsyncResult
. बनाता है संदेश भेजता है और उसी वार्तालाप हैंडल पर आरंभकर्ता को वापस भेजता है जिससे संदेश प्राप्त हुआ था। यह प्रक्रिया यह निर्धारित करने के लिए संदेश प्रकार की भी जांच करती है कि कोईEndDialog
. है या नहीं याError
बातचीत को समाप्त करके साफ करने के लिए संदेश प्राप्त हुआ है।-- क्यू प्रोसेस करने के लिए प्रोसेसिंग प्रोसीजर बनाएं प्रोसेस क्रिएट करें dbo.ProcessingQueueActivationASBEGIN SET NOCOUNT ON; DECLARE @conversation_handle UNIQUEIDENTIFIER; DECLARE @message_body एक्सएमएल; DECLARE @message_type_name sysname; जबकि (1=1) लेन-देन शुरू करें; प्रतीक्षा करें (शीर्ष प्राप्त करें (1) @conversation_handle =वार्तालाप_हैंडल, @message_body =CAST (message_body AS XML), @message_type_name =संदेश_टाइप_नाम प्रोसेसिंग क्यू से), टाइमआउट 5000; IF (@@ROWCOUNT =0) रोलबैक लेनदेन शुरू करें; टूटना; END IF @message_type_name =N'AsyncRequest' BEGIN -- यहां जटिल लंबी प्रोसेसिंग को हैंडल करें -- प्रदर्शन के लिए हम अकाउंट नंबर खींचेंगे और केवल एक उत्तर वापस भेजेंगे DECLARE @AccountNumber INT =@message_body.value('(AsyncRequest/AccountNumber) [1]', 'आईएनटी'); -- उत्तर संदेश बनाएं और DECLARE @reply_message_body XML =N' '+ CAST(@AccountNumber AS NVARCHAR(11)) + '' '; बातचीत पर भेजें @conversation_handle संदेश प्रकार [AsyncResult] (@reply_message_body); END -- यदि संवाद संदेश समाप्त होता है, तो संवाद समाप्त करें ELSE IF @message_type_name =N'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog' BEGIN END CONVERSATION @conversation_handle; END -- यदि त्रुटि संदेश, लॉग करें और वार्तालाप समाप्त करें ELSE IF @message_type_name =N'http://schemas.microsoft.com/SQL/ServiceBroker/Error' BEGIN -- त्रुटि कोड लॉग करें और यहां कोई भी आवश्यक प्रबंधन करें -- अंत त्रुटि के लिए बातचीत END CONVERSATION @conversation_handle; अंत प्रतिबद्ध लेनदेन; ENDENDGO
RequestQueue
इसे भेजे गए संदेशों को संसाधित करने की भी आवश्यकता होगी, इसलिएAsyncResult
को संसाधित करने के लिए एक अतिरिक्त प्रक्रिया ProcessingQueueActivation प्रक्रिया द्वारा लौटाए गए संदेशों को बनाने की आवश्यकता है। चूंकि हम जानते हैं कि AsnycResult संदेश का अर्थ है कि सभी प्रसंस्करण कार्य पूरा हो गया है, एक बार जब हम उस संदेश को संसाधित कर लेते हैं, तो बातचीत समाप्त हो सकती है, जो प्रसंस्करण सेवा को एक EndDialog संदेश भेजेगा, जिसे समाप्त करने के लिए इसकी सक्रियण प्रक्रिया द्वारा संसाधित किया जाएगा। बातचीत सब कुछ साफ करना और आग से बचना और बातचीत ठीक से समाप्त होने पर होने वाली समस्याओं को भूल जाना।-- अनुरोध कतार के उत्तरों को संसाधित करने के लिए प्रक्रिया बनाएं प्रक्रिया बनाएं dbo.RequestQueueActivationASBEGIN SET NOCOUNT ON; DECLARE @conversation_handle UNIQUEIDENTIFIER; DECLARE @message_body एक्सएमएल; DECLARE @message_type_name sysname; जबकि (1=1) लेन-देन शुरू करें; प्रतीक्षा करें (शीर्ष प्राप्त करें (1) @conversation_handle =वार्तालाप_हैंडल, @message_body =CAST (message_body AS XML), @message_type_name =message_type_name फ्रॉम RequestQueue), टाइमआउट 5000; IF (@@ROWCOUNT =0) रोलबैक लेनदेन शुरू करें; टूटना; END IF @message_type_name =N'AsyncResult' BEGIN -- यदि आवश्यक हो तो यहां उत्तर संदेश को हैंडल करें DECLARE @AccountNumber INT =@message_body.value('(AsyncResult/AccountNumber)[1]', 'INT'); -- चूंकि यह सब काम किया जा रहा है, EndDialog संदेश भेजने के लिए बातचीत समाप्त करें END CONVERSATION @conversation_handle; END -- यदि संवाद संदेश समाप्त होता है, तो संवाद समाप्त करें ELSE IF @message_type_name =N'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog' BEGIN END CONVERSATION @conversation_handle; END -- यदि त्रुटि संदेश, लॉग करें और बातचीत समाप्त करें ELSE IF @message_type_name =N'http://schemas.microsoft.com/SQL/ServiceBroker/Error' BEGIN END CONVERSATION @conversation_handle; अंत प्रतिबद्ध लेनदेन; ENDENDGOप्रक्रियाओं का परीक्षण
हमारी सेवाओं के लिए कतार प्रसंस्करण को स्वचालित करने से पहले, यह सुनिश्चित करने के लिए सक्रियण प्रक्रियाओं का परीक्षण करना महत्वपूर्ण है कि वे संदेशों को उचित रूप से संसाधित करते हैं, और कतार को अक्षम होने से रोकने के लिए कोई त्रुटि होती है जिसे ठीक से संभाला नहीं जाता है। चूंकि
ProcessingQueue
. पर पहले से ही एक संदेश हैProcessingQueueActivation
उस संदेश को संसाधित करने के लिए प्रक्रिया निष्पादित की जा सकती है। ध्यान रखें किWAITFOR
प्रक्रिया को समाप्त होने में 5 सेकंड का समय लगेगा, भले ही संदेश को कतार से तुरंत संसाधित किया गया हो। संदेश को संसाधित करने के बाद, हमRequestQueue
. को क्वेरी करके सही ढंग से काम की गई प्रक्रिया को सत्यापित कर सकते हैं यह देखने के लिए कि क्या कोईAsyncResult
है संदेश मौजूद है, और फिर हम सत्यापित कर सकते हैं किRequestQueueActivation
इसे क्रियान्वित करके प्रक्रिया सही ढंग से कार्य करती है।-- प्रोसेसिंग क्यू से संदेश को प्रोसेस करेंEXECUTE dbo.ProcessingQueueActivation;GO - रिक्वेस्ट क्यू पर रिप्लाई मैसेज के लिए चेक करें।प्रसंस्करण को स्वचालित करना
इस बिंदु पर, हमारे प्रसंस्करण को पूरी तरह से स्वचालित करने के लिए सभी घटक पूर्ण हैं। केवल एक चीज शेष है सक्रियण प्रक्रियाओं को उनकी उपयुक्त कतारों से बांधना, और फिर इसे सत्यापित करने के लिए एक और परीक्षण संदेश भेजना है कि यह संसाधित हो जाता है और बाद में कतार में कुछ भी नहीं रहता है।
-- आंतरिक सक्रियण निर्दिष्ट करने के लिए प्रोसेसिंग क्यू को बदलेंALTER QUEUE ProcessingQueue with ACTIVATION ( STATUS =ON, PROCEDURE_NAME =dbo.ProcessingQueueActivation, MAX_QUEUE_READERS =10, EXECUTE AS SELF );GO -- आंतरिक सक्रियण निर्दिष्ट करने के लिए अनुरोध कतार को बदलेंALTER Q एक्टिवेशन के साथ (STATUS =ON, PROCEDURE_NAME =dbo.RequestQueueActivation, MAX_QUEUE_READERS =10, EXECUTE AS SELF);GO -- टेस्ट ऑटोमेटेड एक्टिवेशन-- एक अनुरोध भेजें EXECUTE dbo.SendBrokerMessage @FromService =N'RequestService', @ToService =N' ProcessingService', @Contract =N'AsyncContract', @MessageType =N'AsyncRequest', @MessageBody =N''; - प्रसंस्करण कतार पर संदेश की जांच करें - कुछ भी नहीं है क्योंकि इसे स्वचालित रूप से संसाधित किया गया था, प्रसंस्करण क्यू से चयन करें (संदेश_बॉडी एक्सएमएल) XML के रूप में) RequestQueue से;जाओ 12345 सारांश
SQL सर्वर सर्विस ब्रोकर में स्वचालित एसिंक्रोनस प्रोसेसिंग के लिए बुनियादी घटकों को लंबे समय तक चलने वाले कार्यों के डिकॉउल्ड प्रोसेसिंग की अनुमति देने के लिए एकल डेटाबेस सेटअप में कॉन्फ़िगर किया जा सकता है। एप्लिकेशन के साथ अंतिम उपयोगकर्ता के इंटरैक्शन से प्रोसेसिंग को अलग करके, अंतिम उपयोगकर्ता के अनुभव से, एप्लिकेशन के प्रदर्शन को बेहतर बनाने के लिए यह एक शक्तिशाली उपकरण हो सकता है।