2012-03-02 23 views
7

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

उदाहरण के लिए, एक ईमेल भेजने के लिए, हम अपने डेटाबेस में एक ईमेल ऑब्जेक्ट और ईमेल नौकरी दोनों बनाते हैं। हमें ईमेल नौकरी लेने और इसे भेजने के लिए हमारे जॉब मॉनीटर की प्रतीक्षा करनी है। नौकरी मॉनीटर अनिवार्य रूप से निष्क्रिय होने पर हर कुछ सेकंड डेटाबेस को मतदान करके काम करता है।

हालांकि, यह ईमेल भेजने में देरी जोड़ता है और जो मैं मतदान के साथ डेटाबेस पर अनुचित भार के रूप में देखता हूं जोड़ता हूं। अगर हम ईमेल बनाते हैं तो हम तुरंत कतार पर ईमेल नौकरी डाल सकते हैं तो यह बहुत अच्छा होगा।

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

क्या कतार और डेटाबेस के बीच दो चरण प्रतिबद्धता बनाने के लिए कोई अच्छी रणनीति है? संदर्भ के लिए, हम InnoDB तालिकाओं के साथ RabbitMQ और MySQL का उपयोग कर रहे हैं। डेटाबेस लेनदेन के बाद कतार में ईमेल नौकरियों को छूने का एक विचार था, लेकिन यह संभावना छोड़ देता है कि ईमेल कभी कतारबद्ध नहीं होता है। मुझे अभी भी एक मतदान प्रक्रिया बनाना होगा जो उन ईमेल के लिए देखता है जिन्हें भेजा जाना चाहिए था और नहीं थे।

उत्तर

0

मुझे एहसास है कि यह दो साल देर हो चुकी है :) लेकिन मैं इस प्रश्न में चलने वाले अन्य लोगों के लिए इस पर कुछ विचार जोड़ना चाहता था।

नौकरियां प्राप्त होने पर डीबी तैयार होने का मौका बढ़ाने के लिए आप देरी संदेश भेज सकते हैं। मैंने कभी भी RabbitMQ का उपयोग नहीं किया है, लेकिन मुझे एक rabbitMQ कतार का उपयोग देरी हुई कतार How to create a delayed queue in RabbitMQ? के रूप में करने का यह उदाहरण मिला। आपके ईमेल-जॉब को अभी भी किसी भी असम्बद्ध रिकॉर्ड से निपटने की आवश्यकता होगी क्योंकि देरी से वितरित प्रसंस्करण से निपटने का एक निर्धारिक तरीका नहीं है।

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