RabbitMQ میں، جب یک برقرار منقولی (ایک پیغام جسے مصرف کنندگان نہیں پرداز کر سکتے) ایک قطار میں تبدیل ہوتا ہے، تو وہاں سے وہ ایک اور ایکسچینجز کو رواج دیا جاتا ہے، جسے ہم مردہ پیغام ایکسچینج کہتے ہیں۔ مردہ پیغام ایکسچینج پھر مردہ پیغام کو ایک قطار کو پہنچاتا ہے، جو کہ مردہ پیغام قطار ہوتی ہے۔

مردہ پیغام قطار کی وضاحت

مردہ پیغام قطار

اوپر کی وضاحت میں پوری پروسیس کو بیان کیا گیا ہے، جو مردہ پیغام کی تخلیق سے لے کر ان کے ہندلنگ تک ہے۔

مردہ پیغام کی تخلیق

مردہ پیغام کی تخلیق کیلئے مندرجہ ذیل شرائط ہیں:

  • پیغام کو مصرف کنندہ کی طرف سے دستی طور پر نا منظور کر دیا جاتا ہے (بنیادی.رجیکٹ / بنیادی.نیک) اور دوبارہ قطار میں داخل نہیں کیا گیا ہے۔
  • پیغام کا وقت-تا-جانے (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 مردہ پیغام ایکسچینج کو فورورڈ کردیئے جائیں گے۔