2009-08-12 9 views
15

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

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

  • हर बार जब मैं एक कार्य आइटम को घेरता हूं, तो मैं एक नई बातचीत शुरू करता हूं। तो प्रत्येक बातचीत में वास्तव में एक संदेश होने के समाप्त होता है।
  • तैनाती के समय पर, मैं मैन्युअल रूप से एक अनंत अनंत जीवनशैली बना देता हूं। जब एक कार्य आइटम को घेरने का समय होता है, तो मैं हमेशा इसे एक ही वार्तालाप के हिस्से के रूप में भेजता हूं।

इन मार्गों में से किसी एक के जाने का क्या परिणाम होगा?

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

+0

आप एक कतार के बारे में बात कर रहे हैं, लेकिन ... http://stackoverflow.com/questions/14643015/क्यों-do-i-need-two-sql-server-service-broker-queues-for-a-simple-task – cja

उत्तर

26

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

यह सबसे सरल तैनाती है और इसे प्राप्त करना और चलाना सुनिश्चित करेगा कि आपके पास निर्माण करने के लिए एक अच्छी नींव है। कोनों को काटिये और जब निर्माता निर्माता कार्य आइटम को घेर लेता है तब से आरंभकर्ता पक्ष पर संवाद समाप्त करें, यह fire-and-forget and has several draw backs है।

यदि आपके पास उच्च प्रदर्शन आवश्यकताओं (प्रति सेकंड 200 से अधिक अनुरोध) हैं तो आपको वार्तालापों को अधिक स्पष्ट रूप से प्रबंधित करना प्रारंभ करना होगा। मेरे पास reusing conversations for performance reasons पर एक ब्लॉग प्रविष्टि है। प्राप्त पक्ष पर मैं Writing Service Broker Procedures पढ़ने की अनुशंसा करता हूं।

मेरे पास एक ब्लॉग एंट्री भी है जो आपको बहुत कुछ चाहिए जो आपको चाहिए, यद्यपि यह कार्य आइटम शेड्यूल नहीं करता है बल्कि इसके बजाय एक कस्टम प्रक्रिया लॉन्च करता है: Asynchronous procedure execution

यदि आप सक्रिय संदर्भ से कार्य आइटमों का उपभोग करने का निर्णय लेते हैं, इस प्रकार सक्रियण की अच्छी आत्म संतुलन क्षमताओं का लाभ उठाते हैं, तो आपको understand the EXECUTE AS context under which activation occurs की आवश्यकता होती है।

+0

बातचीत का पुन: उपयोग करने का एक अन्य लाभ यह है कि आप "माइक्रोसॉफ्ट आंतरिक कार्य अनुरोध 642585" में वर्णित समस्या से बचते हैं (सार्वजनिक नहीं)। अर्थात्, आप जो भी वार्तालाप बनाते हैं और नष्ट करते हैं, वह TempDB में आवंटित स्थान की एक छोटी राशि को रिसाव करता है जिसे तब तक जारी नहीं किया जाता जब तक आप उदाहरण को उछाल नहीं देते। उच्च थ्रूपुट अनुप्रयोगों में यह TempDB के आकार को उड़ा सकता है और इसे फिर से कम करने के लिए इंस्टेंस को पुनरारंभ करने के लिए मजबूर कर सकता है। –

+0

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

9

मुझे वास्तव में रीमस का जवाब पसंद है, हालांकि यह पर विशेष रूप से स्पर्श नहीं करता है क्यों आप सभी कार्य आइटमों को एक ही बातचीत में रखने के बजाय प्रति कार्य आइटम को अलग बातचीत शुरू करना पसंद कर सकते हैं।इस से संबंधित दो टिप्पणियां:

सबसे पहले, एक बातचीत में सब काम आइटम डाल शायद संगामिति समस्याओं का कारण होगा यदि आप एक से अधिक थ्रेड/प्रक्रियाओं प्रसंस्करण काम आइटम नहीं हैं। सेवा दलाल कार्यकर्ता प्रक्रियाओं इस तरह देखने के लिए (स्यूडोकोड में) करते हैं:

begin transaction 
receive top n work items from queue 
process work items 
commit transaction 

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

समेकन समस्या उत्पन्न होगी क्योंकि सेवा दलाल प्रोग्राम किया गया है कि प्रत्येक रिसीव कमांड कतार में सभी संदेशों पर एक विशेष रीड लॉक प्राप्त करता है जो समान बातचीत साझा करता है (या वार्तालाप समूह) जिन्हें रिसीव किया गया था। वह लॉक तब तक आयोजित होता है जब तक कि लेनदेन नहीं किया जाता है। (Conversation Group Locks देखें।) कतार में सब काम आइटम एक बातचीत में कर रहे हैं तो अगर, तो, जबकि एक कार्यकर्ता प्रक्रिया "प्रक्रिया काम आइटम" चरण में है, कोई अन्य कार्यकर्ता प्रक्रियाओं किसी भी काम कर रही हो सकता है।

एक बातचीत में आइटम के बहुत सारे डालने के साथ एक दूसरा मुद्दा यह है कि यह काम आइटम आप खो देते हैं या कुछ त्रुटि की स्थिति में पुनर्संसाधन करना पड़ सकता है की मात्रा बढ़ जाती है। इसे ठीक से वर्णन करने के लिए मैं रीमस को रोकता हूं; उसकी Recycling Conversations, विशेष रूप से हिस्सा कहते हैं कि "आपकी सभी संदेश भेजने के लिए एक भी संवाद पुन: उपयोग [...] एक टोकरी में अपने सभी अंडे डाल की तरह है।" आप इनमें से कुछ त्रुटि स्थितियों से पुनर्प्राप्त करने में सक्षम हो सकते हैं, लेकिन यह शायद आपके कोड पर अधिक जटिलता पेश करेगा।

शायद कुछ और तर्क सब काम मदों के लिए एक बातचीत का उपयोग कर के खिलाफ किए जाने के लिए कर रहे हैं, लेकिन मैं उन लोगों के साथ साथ के रूप में परिचित नहीं हूँ।

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

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