RabbitMQ में, जब एक मैसेज कतई (a message that consumers cannot process) बन जाता है, तो उसे एक और एक्सचेंज पर पुनर्निर्देशित किया जाता है, जिसे हम डेड लेटर एक्सचेंज कहते हैं। डेड लेटर एक्सचेंज फिर एक कतई कतई तक पहुंचाता है, जो कि डेड लेटर कतई होता है।

डेड लेटर कतई व्याख्या

Dead Letter Queue

उपरोक्त व्याख्या को मरे हुए पत्रों के उत्पन्न होने से उनके संबंध में विवरणित करती है।

मरे हुए पत्रों का उत्पन्न होना

निम्नलिखित मामले मरे हुए पत्रों के उत्पन्न होने के लिए हैं:

  • मैसेज को उपभोक्ता द्वारा मैन्युअल रूप से अस्वीकृत किया जाता है (basic.reject / basic.nack), और requeue = false
  • मैसेज का समय-से-जीवन (TTL) समाप्त हो जाता है
  • कतई अनुरोध की अधिकतम लम्बाई तक पहुँच जाती है

डेड लेटर कतई कतई व्यवस्था कदम

  1. एक डेड लेटर एक्सचेंज परिभाषित करें (नाम से भ्रमित न हों, यह साधारण एक्सचेंज है, यह केवल मरे हुए पत्र संबंधित संदर्भ में ही ऐसा कहा गया है)।
  2. डेड लेटर एक्सचेंज से बाँधने के लिए एक कतई कतई क्यू निर्धारित करें (यह क्यू डेड लेटर क्यू कहलाता है, और यह भी एक साधारण क्यू है)।
  3. एक मरे हुए पत्र उपभोक्ता को डेड लेटर क्यू को सेवन करने के लिए परिभाषित करें (नाम से भ्रमित न हों, यह भी एक साधारण उपभोक्ता है)।
  4. डेड लेटर एक्सचेंज को निर्दिष्ट क्यू से बाँधें (मरे हुए पत्रों को संबोधित करने वाली क्यू को बाँधना चाहिए)।

सुझाव: सिद्धांत के लिए उपरोक्त व्याख्या का संदर्भ लें। सभी प्रोग्रामिंग भाषाएँ मरे हुए पत्र क्यू को समान ढंग से संबोधित करती हैं।

Golang में डेड लेटर क्यू का संबोधन

1. मरे हुए पत्र एक्सचेंज को परिभाषित करें

इसे एक साधारण एक्सचेंज की तरह परिभाषित करें।

// एक्सचेंज की घोषणा करें
err = ch.ExchangeDeclare(
    "tizi365.dead",   // एक्सचेंज नाम
    "topic", // एक्सचेंज प्रकार
    true,     // स्थायी
    false,
    false,
    false,
    nil,
)

2. मरे हुए पत्र क्यू को परिभाषित करें

इसे एक साधारण कतई क्यू की तरह परिभाषित करें।

    // क्यू की घोषणा करें
    q, err := ch.QueueDeclare(
        "",    // क्यू नाम, एक स्वत: उत्पन्न करने के लिए रिक्त छोड़ें
        false, // स्थायी क्यू
        false,
        true,
        false,
        nil,
    )

    // क्यू को मरे हुए पत्र एक्सचेंज से बाँधें
    err = ch.QueueBind(
        q.Name, // क्यू नाम
        "#",     // रूटिंग की, # का अर्थ है सभी रूटिंग की को मिलाना, अर्थात सभी मरे हुए पत्र संदेश प्राप्त करने का मतलब
        "tizi365.dead", // मरे हुए पत्र एक्सचेंज नाम
        false,
        nil)

सुझाव: मरे हुए पत्र क्यू को एक साधारण क्यू के रूप में देखें।

3. मरे हुए पत्र उपभोक्ता को परिभाषित करें

// एक उपभोक्ता बनाएं
msgs, err := ch.Consume(
    q.Name, // पहले मरे हुए पत्र क्यू नाम का संदर्भ
    "",     // उपभोक्ता नाम, यदि नहीं दिया गया है, तो एक स्वत: उत्पन्न हो जाएगा
    true,   // संदेश प्रसंस्करण का स्वत: स्वीकृति
    false, 
    false, 
    false, 
    nil,
)

// मरे हुए पत्र क्यू से संदेश सेवन करने के लिए लूप चलाएं
for d := range msgs {
    log.Printf("मरे हुए पत्र संदेश प्राप्त किया=%s", d.Body)
}

4. मरे हुए पत्र एक्सचेंज को एक विशिष्ट क्यू से बाँधें

	// क्यू गुण
	props := make(map[string]interface{})
	// मरे हुए पत्र एक्सचेंज को बाँधें
	props["x-dead-letter-exchange"] = "tizi365.dead"
	// वैकल्पिक: मरे हुए पत्र को मरे हुए पत्र एक्सचेंज को पहुंचाने पर रूटिंग की सेट करें। यदि सेट नहीं किया गया है, तो मूल संदेश की रूटिंग की का प्रयोग किया जाएगा।
	// props["x-dead-letter-routing-key"] = "www.tizi365.com"

	q, err := ch.QueueDeclare(
		"tizi365.demo.hello", // क्यू नाम
		true,   // स्थायी
		false, 
		false, 
		false,   
		props,     // क्यू गुण सेट करें
	)

इस तरह, अगर tizi365.demo.hello क्यू में संदेश मरे हुए पत्र बन जाते हैं, तो वे tizi365.dead मरे हुए पत्र एक्सचेंज पर पुनर्निर्देशित किए जाएंगे।