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