في RabbitMQ، عندما يصبح رسالة رسالة ميتة (رسالة لا يمكن للمستهلكين معالجتها) في طابور الانتظار، يتم إعادة توجيهها إلى تبادل آخر، والذي نسميه تبادل رسائل ميتة. ثم يقوم تبادل الرسائل الميتة بتسليم الرسالة الميتة إلى طابور انتظار آخر، وهو طابور الرسائل الميتة.

رسم توضيحي لطابور الرسائل الميتة

طابور الرسائل الميتة

الرسم التوضيحي أعلاه يصف العملية بأكملها من إنشاء رسائل ميتة إلى معالجتها.

إنشاء رسائل ميتة

هذه هي الشروط لإنشاء الرسائل الميتة:

  • تم رفض الرسالة يدويًا من قبل المستهلك (basic.reject / basic.nack)، و requeue = false.
  • انتهاء وقت الحياة المبرمج للرسالة (TTL).
  • يصل الطابور إلى الحد الأقصى للطول.

خطوات معالجة طابور الرسائل الميتة

  1. تعريف تبادل الرسائل الميتة (لا تدع نفسك تضل من الاسم، إنه مجرد تبادل عادي، ويُسمى ذلك فقط في سياق معالجة الرسائل الميتة).
  2. تعريف طابور مرتبط بتبادل الرسائل الميتة (يُسمى هذا الطابور طابور الرسائل الميتة، وهو أيضًا طابور عادي).
  3. تعريف مستهلك للرسائل الميتة للاستهلاك من طابور الرسائل الميتة (لا تدع نفسك تضل من الاسم، إنه أيضًا مستهلك عادي).
  4. ربط تبادل الرسائل الميتة بالطابور المحدد (يجب ربط الطابور الذي يحتاج إلى معالجة الرسائل الميتة).

نصيحة: راجع الرسم التوضيحي أعلاه للمبدأ. جميع لغات البرمجة تعالج طوابير الرسائل الميتة بنفس الطريقة.

معالجة طابور الرسائل الميتة في جولانج

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.