उपभोक्ता स्वीकृतियाँ और पुनः कतारबद्ध करना
उपभोक्ता स्वीकृतियों में निपुण बनें और संसाधन विफल होने पर संदेशों को पुनः कतार में डालना सीखें। ऐसे त्रुटि-सहिष्णु उपभोक्ता बनाएँ जो त्रुटियों को सहजता से संभाल सकें।
उपभोक्ता स्वीकृतियाँ और पुनः कतारबद्ध करना, CoddyKit पर RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
विश्वसनीय संदेश उपभोग
वितरित प्रणालियों में, संदेशों को सही ढंग से संसाधित किया जाना अत्यंत महत्वपूर्ण है। यदि कोई उपभोक्ता संसाधन के बीच में क्रैश हो जाए तो क्या होगा? या यदि किसी संदेश से त्रुटि उत्पन्न हो जाए तो?
यह पाठ उपभोक्ता स्वीकृतियों और पुनः कतारबद्ध करने की पड़ताल करता है—दोष-सहिष्णु संदेश उपभोक्ता बनाने की आवश्यक तकनीकें।
ACK: हस्तमिलान
उपभोक्ता स्वीकृति (ACK), उपभोक्ता द्वारा RabbitMQ को वापस भेजा गया संकेत है। यह ब्रोकर को बताता है: "मैंने इस संदेश को सफलतापूर्वक प्राप्त और संसाधित कर लिया है।"
- ACK के बिना, RabbitMQ मानता है कि संदेश संसाधित नहीं हुआ है।
- यह व्यवस्था किसी उपभोक्ता के अपना काम पूरा करने से पहले विफल होने पर संदेश की हानि रोकती है।
स्वचालित बनाम मैन्युअल ACK
RabbitMQ संदेशों की स्वीकृति देने के दो तरीके प्रदान करता है:
- स्वचालित (
autoAck=true): उपभोक्ता को डिलीवरी होते ही संदेशों की स्वीकृति दे दी जाती है। यह सरल है, लेकिन संसाधन विफल होने पर जोखिमपूर्ण है। - मैन्युअल (
autoAck=false): सफल संसाधन के बाद उपभोक्ता स्पष्ट रूप से ACK भेजता है। विश्वसनीय प्रणालियों के लिए यही डिफ़ॉल्ट और अनुशंसित तरीका है।
हम मजबूत प्रणालियों के लिए मैन्युअल स्वीकृतियों पर ध्यान देंगे।
संदेश भेजना (उत्पादक)
आइए संदेश भेजने के लिए एक सरल Java उत्पादक सेट अप करते हैं। इस संदेश का उपभोग बाद में किया जाएगा और हम मैन्युअल स्वीकृतियों का उपयोग करेंगे।
"Hello RabbitMQ!" संदेश भेजने के लिए यह कोड चलाएँ।
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.nio.charset.StandardCharsets;
public class MyProducer {
private final static String QUEUE_NAME = "ack_queue";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost"); // Connect to local RabbitMQ
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "Hello RabbitMQ!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));
System.out.println(" [x] Sent '" + message + "'");
}
}
}मैन्युअल स्वीकृतियों का उपयोग
अब, आइए ऐसा उपभोक्ता बनाएँ जो मैन्युअल स्वीकृतियों का उपयोग करता हो। ध्यान दें कि उपभोग करते समय autoAck पैरामीटर को false पर सेट किया गया है।
channel.basicAck() कॉल सफल संसाधन की पुष्टि करती है।
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
import java.nio.charset.StandardCharsets;
public class MyConsumerAck {
private final static String QUEUE_NAME = "ack_queue";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
System.out.println(" [x] Received '" + message + "'");
try {
// Simulate processing work
Thread.sleep(1000);
System.out.println(" [x] Done processing '" + message + "'");
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); // Manual ACK!
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.err.println(" [!] Processing interrupted.");
// In a real app, you might re-queue or handle error
}
};
// autoAck is set to false for manual acknowledgements
channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> {});
}
}संसाधन विफल होने पर
यदि संदेश संसाधित करते समय हमारे उपभोक्ता को कोई त्रुटि मिल जाए तो क्या होगा? यदि हम केवल basicAck का उपयोग करें, तो संसाधन पूरा न होने पर भी संदेश खो जाएगा।
RabbitMQ ब्रोकर को यह बताने के तरीके प्रदान करता है कि कोई संदेश सफलतापूर्वक संसाधित नहीं हो सका, जिससे हमें उसे संभालने के विकल्प मिलते हैं।
विफल संदेशों को फिर से कतार में डालना
यदि किसी अस्थायी त्रुटि (जैसे डेटाबेस कनेक्शन बंद होना) के कारण संदेश का संसाधन विफल हो जाता है, तो आप उसे बाद में फिर से आज़माना चाह सकते हैं। channel.basicNack(deliveryTag, multiple, requeue) या channel.basicReject(deliveryTag, requeue) का उपयोग करें।
requeueकोtrueपर सेट करने से संदेश वापस कतार में चला जाता है, ताकि कोई दूसरा उपभोक्ता उसे प्राप्त कर सके।
इस उपभोक्ता को चलाएँ। यह जानबूझकर दो बार विफल होगा और फिर संदेश को सफलतापूर्वक संसाधित करेगा।
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;
public class MyConsumerRequeue {
private final static String QUEUE_NAME = "ack_queue";
private static int attemptCount = 0;
public static void main(String[] argv) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
long deliveryTag = delivery.getEnvelope().getDeliveryTag();
System.out.println(" [x] Received '" + message + "' (Attempt: " + (++attemptCount) + ")");
try {
if (attemptCount <= 2) { // Simulate failure for first 2 attempts
throw new RuntimeException("Simulated processing error!");
}
// Simulate successful processing
Thread.sleep(1000);
System.out.println(" [x] Successfully processed '" + message + "'");
channel.basicAck(deliveryTag, false); // ACK on success
} catch (Exception e) {
System.err.println(" [!] Error processing '" + message + "': " + e.getMessage());
channel.basicNack(deliveryTag, false, true); // NACK and requeue!
System.out.println(" [!] Message '" + message + "' requeued.");
}
};
channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> {});
}
}समस्याग्रस्त संदेशों को हटाना
कभी-कभी कोई संदेश मूल रूप से ही गलत होता है और *हर बार* त्रुटि उत्पन्न करेगा। उसे बार-बार कतार में डालना निरर्थक है और इससे "विषैला संदेश" चक्र बन सकता है।
ऐसे मामलों में requeue को false पर सेट करें। इससे संदेश कतार से हटा दिया जाता है। अक्सर ऐसे संदेशों को बाद में जाँच के लिए डेड लेटर एक्सचेंज (DLX) में भेजा जाता है, लेकिन DLX को हम भविष्य के पाठ में समझेंगे।
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;
public class MyConsumerReject {
private final static String QUEUE_NAME = "ack_queue";
public static void main(String[] argv) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
long deliveryTag = delivery.getEnvelope().getDeliveryTag();
System.out.println(" [x] Received '" + message + "'");
// Simulate an unrecoverable error
System.err.println(" [!] Fatal error for '" + message + "'. Discarding.");
channel.basicNack(deliveryTag, false, false); // NACK and DO NOT requeue!
System.out.println(" [!] Message '" + message + "' rejected (not requeued).");
};
channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> {});
}
}आइडेम्पोटेंट उपभोक्ता
जब आप संदेशों को फिर से कतार में डालते हैं, तो संभावना रहती है कि कोई उपभोक्ता उसी संदेश को कई बार संसाधित कर दे।
अपने उपभोक्ताओं को आइडेम्पोटेंट रूप में डिज़ाइन करना अत्यंत महत्वपूर्ण है। इसका अर्थ है कि उसी संदेश को दो बार (या अधिक बार) संसाधित करने पर अनपेक्षित प्रभावों के बिना वही परिणाम मिले, जो उसे एक बार संसाधित करने पर मिलता है।
विश्वसनीयता जाँच
मैन्युअल स्वीकृतियों के साथ कॉन्फ़िगर किए गए RabbitMQ उपभोक्ता पर विचार करें। यदि कोई संदेश प्राप्त हो जाए, लेकिन उपभोक्ता channel.basicAck() या channel.basicNack() कॉल करने से *पहले* क्रैश हो जाए, तो आमतौर पर उस संदेश के साथ क्या होता है?
पुनरावलोकन: विश्वसनीय उपभोक्ता बनाना
आपने अपने RabbitMQ उपभोक्ताओं को अधिक लचीला बनाना सीख लिया है:
- मैन्युअल स्वीकृतियाँ: उपभोक्ताओं को संदेश के भाग्य पर नियंत्रण देती हैं।
- पुनः कतारबद्ध करना:
basicNack(..., true)का उपयोग करके अस्थायी विफलताओं वाले संदेशों को फिर से आज़माएँ। - हटाना:
basicNack(..., false)से विषैले संदेशों के चक्र को रोकें। - आइडेम्पोटेंसी: उपभोक्ताओं को डुप्लिकेट डिलीवरी को सहजता से संभालने के लिए डिज़ाइन करें।
मजबूत और दोष-सहिष्णु संदेश प्रणालियाँ बनाने के लिए ये तकनीकें मूलभूत हैं।
एआई शिक्षक के साथ RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 11
- पाठ
- 44
अक्सर पूछे जाने वाले प्रश्न
क्या “उपभोक्ता स्वीकृतियाँ और पुनः कतारबद्ध करना” पाठ निःशुल्क है?
हाँ — RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “उपभोक्ता स्वीकृतियाँ और पुनः कतारबद्ध करना” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“उपभोक्ता स्वीकृतियाँ और पुनः कतारबद्ध करना” में मैं क्या सीखूँगा?
उपभोक्ता स्वीकृतियों में निपुण बनें और संसाधन विफल होने पर संदेशों को पुनः कतार में डालना सीखें। ऐसे त्रुटि-सहिष्णु उपभोक्ता बनाएँ जो त्रुटियों को सहजता से संभाल सकें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“उपभोक्ता स्वीकृतियाँ और पुनः कतारबद्ध करना” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- स्थायी मैसेज और कतारें
- विश्वसनीयता के लिए प्रकाशक पुष्टियाँ
- उपभोक्ता स्वीकृतियाँ और पुनः कतारबद्ध करना
- ट्रांज़ैक्शन बनाम प्रकाशक पुष्टि