RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ · पाठ

मैसेज स्वीकृतियाँ और टिकाऊपन

मैन्युअल स्वीकृतियाँ लागू करके और मैसेज तथा कतारों को टिकाऊ बनाकर मैसेज की विश्वसनीयता सुनिश्चित करें। कंज़्यूमर या ब्रोकर की विफलता की स्थिति में डेटा हानि रोकें।

पाठ 3, कुल 4 में से11 चरण

मैसेज स्वीकृतियाँ और टिकाऊपन, CoddyKit पर RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

विश्वसनीयता का परिचय

वितरित प्रणालियों में संदेशों का विश्वसनीय रूप से संसाधित होना सुनिश्चित करना अत्यंत महत्वपूर्ण है। यदि कोई सर्वर क्रैश हो जाए तो क्या होगा? या यदि संदेश उपभोक्ता प्रसंस्करण के बीच में विफल हो जाए?

यह पाठ RabbitMQ में डेटा की हानि रोकने और विश्वसनीयता सुनिश्चित करने वाले दो महत्वपूर्ण तंत्रों की पड़ताल करता है: संदेशों और कतारों, दोनों के लिए संदेश स्वीकृतियाँ और टिकाऊपन।

संदेश स्वीकृतियाँ क्या हैं?

जब कोई उपभोक्ता संदेश प्राप्त करता है, तो उसे RabbitMQ को बताना होता है कि उसने संदेश को सफलतापूर्वक संसाधित कर लिया है। इस पुष्टि को स्वीकृति (या 'ack') कहा जाता है।

  • स्वीकृतियों के बिना: यदि उपभोक्ता प्रसंस्करण से पहले क्रैश हो जाए, तो संदेश खो जाता है।
  • स्वीकृतियों के साथ: यदि उपभोक्ता क्रैश हो जाए, तो RabbitMQ जानता है कि संदेश स्वीकार नहीं किया गया था और वह उसे किसी अन्य उपभोक्ता को फिर से भेज सकता है।

स्वचालित बनाम मैन्युअल स्वीकृतियाँ

RabbitMQ स्वीकृतियों के लिए दो मोड का समर्थन करता है:

  • स्वचालित (Auto-ack): संदेश उपभोक्ता को डिलीवर होते ही RabbitMQ उसे स्वीकृत मान लेता है। यह सरल है, लेकिन जोखिमपूर्ण है, क्योंकि संदेश प्राप्त होने के तुरंत बाद, परंतु प्रसंस्करण से पहले, उपभोक्ता क्रैश हो जाए तो संदेश खो सकता है।
  • मैन्युअल (Explicit Ack): संदेश को सफलतापूर्वक संसाधित करने के *बाद* उपभोक्ता स्पष्ट रूप से RabbitMQ को स्वीकृति भेजता है। विश्वसनीय प्रसंस्करण के लिए यही अनुशंसित तरीका है।

मैन्युअल स्वीकृतियाँ लागू करना

आइए देखें कि Java उपभोक्ता में मैन्युअल स्वीकृतियाँ कैसे लागू की जाती हैं। हमारा संदेश प्रसंस्करण तर्क पूरा होने के बाद हम channel.basicAck() का उपयोग करते हैं।

इस उदाहरण को चलाकर देखिए। थोड़ी देर बाद उपभोक्ता संदेश को स्वीकार कर लेगा।

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;

public class ConsumerAck {
    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();

        // Declare a non-durable queue
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

        // Set prefetch count to 1 for fair dispatch (covered in Work Queues)
        channel.basicQos(1);

        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println(" [x] Received '" + message + "'");
            try {
                Thread.sleep(1000); // Simulate work
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
            System.out.println(" [x] Done and Acknowledged");
        };
        
        // false means manual acknowledgement
        channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> {});

        // Producer to send a message (for testing)
        Channel producerChannel = connection.createChannel();
        producerChannel.queueDeclare(QUEUE_NAME, false, false, false, null);
        producerChannel.basicPublish("", QUEUE_NAME, null, "Hello Ack!".getBytes("UTF-8"));
        System.out.println(" [x] Sent 'Hello Ack!'");
    }
}

विफल संदेश प्रसंस्करण का प्रबंधन

यदि कोई उपभोक्ता किसी संदेश को संसाधित करने में विफल हो जाए तो क्या होगा? उसे स्वीकार करने के बजाय, आप उसे नकारात्मक रूप से स्वीकार कर सकते हैं:

  • channel.basicNack(deliveryTag, multiple, requeue): एक या अधिक संदेशों को अस्वीकार करता है।
  • channel.basicReject(deliveryTag, requeue): एक संदेश को अस्वीकार करता है।

requeue पैरामीटर अत्यंत महत्वपूर्ण है। यदि यह true है, तो संदेश किसी अन्य उपभोक्ता के लिए कतार में वापस भेज दिया जाता है। यदि यह false है, तो संदेश हटा दिया जाता है या Dead Letter Exchange (DLX) को भेज दिया जाता है, जिसके बारे में हम बाद के पाठ में जानेंगे।

संदेश टिकाऊपन क्या है?

स्वीकृतियाँ उपभोक्ता की विफलताओं का प्रबंधन करती हैं, लेकिन RabbitMQ ब्रोकर के बारे में क्या? यदि सर्वर क्रैश हो जाए या फिर से शुरू हो जाए, तो कतारों में मौजूद संदेशों का क्या होगा?

संदेश टिकाऊपन यह सुनिश्चित करता है कि संदेश डिस्क पर बने रहें और ब्रोकर के फिर से शुरू होने के बाद भी सुरक्षित रहें। इसका अर्थ है कि महत्वपूर्ण संदेश कभी नहीं खोते, भले ही RabbitMQ सर्वर अप्रत्याशित रूप से बंद हो जाए।

संदेशों को स्थायी बनाना

किसी संदेश को टिकाऊ बनाने के लिए, प्रकाशित करते समय उसे 'persistent' के रूप में चिह्नित करना होता है। इससे RabbitMQ को संदेश डिस्क पर लिखने का निर्देश मिलता है।

इसके लिए हम MessageProperties.PERSISTENT_TEXT_PLAIN का उपयोग करते हैं।

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;

public class ProducerPersistent {
    private final static String QUEUE_NAME = "persistent_queue";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {
            
            // Declare a durable queue first!
            channel.queueDeclare(QUEUE_NAME, true, false, false, null);
            
            String message = "Hello Persistent Message!";
            channel.basicPublish(
                "", 
                QUEUE_NAME, 
                MessageProperties.PERSISTENT_TEXT_PLAIN, // Mark message as persistent
                message.getBytes("UTF-8")
            );
            System.out.println(" [x] Sent '" + message + "'");
        }
    }
}

कतार टिकाऊपन क्या है?

संदेशों की तरह कतारें भी टिकाऊ हो सकती हैं। यदि कोई कतार टिकाऊ नहीं है, तो RabbitMQ ब्रोकर के फिर से शुरू होने पर वह खो जाएगी। उसमें मौजूद सभी संदेश (यहाँ तक कि स्थायी संदेश भी!) खो जाएँगे।

इसलिए वास्तविक विश्वसनीयता के लिए कतार और उसमें मौजूद संदेश, दोनों का टिकाऊ होना आवश्यक है।

टिकाऊ कतार घोषित करना

किसी कतार को टिकाऊ बनाने के लिए, उसे घोषित करते समय durable पैरामीटर को true पर सेट करना होता है। उत्पादक और उपभोक्ता, दोनों को कतार घोषित करते समय ऐसा करना आवश्यक है।

इस उदाहरण को चलाइए। यह एक टिकाऊ कतार घोषित करता है और एक स्थायी संदेश भेजता है।

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;

public class ProducerDurable {
    private final static String DURABLE_QUEUE = "my_durable_queue";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {
            
            // Declare a durable queue (durable = true)
            channel.queueDeclare(
                DURABLE_QUEUE, 
                true,  // durable
                false, // exclusive
                false, // autoDelete
                null   // arguments
            );
            
            String message = "Hello from a durable queue!";
            channel.basicPublish(
                "", 
                DURABLE_QUEUE, 
                MessageProperties.PERSISTENT_TEXT_PLAIN, // Persistent message
                message.getBytes("UTF-8")
            );
            System.out.println(" [x] Sent '" + message + "' to durable queue.");
        }
    }
}

विश्वसनीयता की त्वरित जाँच

अधिकतम संदेश विश्वसनीयता सुनिश्चित करने के लिए (ताकि उपभोक्ता या ब्रोकर विफल होने पर भी संदेश न खोएँ), आम तौर पर किन सुविधाओं के संयोजन की आवश्यकता होती है?

पुनरावलोकन और अगले चरण

आपने अपने RabbitMQ संदेश-प्रणाली को अधिक विश्वसनीय बनाना सीख लिया है!

  • मैन्युअल स्वीकृतियाँ संदेश प्रसंस्करण की पुष्टि करती हैं और उपभोक्ता की विफलता पर संदेश की हानि रोकती हैं।
  • संदेश टिकाऊपन (स्थायी संदेश) यह सुनिश्चित करता है कि संदेश ब्रोकर के फिर से शुरू होने के बाद भी सुरक्षित रहें।
  • कतार टिकाऊपन यह सुनिश्चित करता है कि कतार की परिभाषा स्वयं ब्रोकर के फिर से शुरू होने के बाद भी सुरक्षित रहे।

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

शुरुआत निःशुल्क

एआई शिक्षक के साथ RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
11
पाठ
44

अक्सर पूछे जाने वाले प्रश्न

क्या “मैसेज स्वीकृतियाँ और टिकाऊपन” पाठ निःशुल्क है?

हाँ — RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “मैसेज स्वीकृतियाँ और टिकाऊपन” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“मैसेज स्वीकृतियाँ और टिकाऊपन” में मैं क्या सीखूँगा?

मैन्युअल स्वीकृतियाँ लागू करके और मैसेज तथा कतारों को टिकाऊ बनाकर मैसेज की विश्वसनीयता सुनिश्चित करें। कंज़्यूमर या ब्रोकर की विफलता की स्थिति में डेटा हानि रोकें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“मैसेज स्वीकृतियाँ और टिकाऊपन” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Hello World: सरल कतार
  2. वर्क कतारें: निष्पक्ष वितरण
  3. मैसेज स्वीकृतियाँ और टिकाऊपन
  4. Fanout एक्सचेंज के साथ प्रकाशन-सदस्यता
← RabbitMQ संदेश-प्रणाली और अतुल्यकालिक प्रणालियाँ पर वापस जाएँ