نظرة عامة على قوائم انتظار Service Bus غير المستخدمة

توفر قوائم انتظار Azure Service Bus والاشتراكات للموضوعات قائمة فرعية ثانوية، تسمى قائمة انتظار غير مستخدمة(DLQ). لا يلزم إنشاء قائمة الانتظار غير المستخدمة بشكل صريح ولا يمكن حذفها أو إدارتها بشكل مستقل عن الكيان الرئيسي.

توضح هذه المقالة قوائم الانتظار غير المستخدمة في Azure Service Bus. ويتضح الكثير من المناقشة من خلال عينة قوائم الانتظار غير المستخدمة على GitHub.

قائمة انتظار غير مستخدمة

الغرض من قائمة انتظار الرسائل غير المستخدمة هو الاحتفاظ بالرسائل التي لا يمكن تسليمها إلى أي جهاز استقبال، أو الرسائل التي لا يمكن معالجتها. يمكن بعد ذلك إزالة الرسائل من DLQ وفحصها. قد يقوم أحد التطبيقات بمساعدة عامل تشغيل، بتصحيح المشكلات وإعادة إرسال الرسالة، وتسجيل حقيقة وجود خطأ، واتخاذ الإجراء التصحيحي.

من منظور API والبروتوكول، تعتبر DLQ في الغالب مشابهة لأي قائمة انتظار أخرى، إلا أنه يمكن إرسال الرسائل فقط من خلال تشغيل الكيان الأصل غير المستخدم. بالإضافة إلى ذلك، لم تُلاحظ مدة البقاء، ولا يمكنك إرسال رسالة من DLQ. قائمة الانتظار غير المستخدمة تدعم بشكل كامل تسليم قفل التحرير وعمليات المعاملات.

لا يوجد تنظيف تلقائي لـ DLQ. تبقى الرسائل في DLQ حتى يمكنك استردادها بوضوح من DLQ واستكمال الرسالة غير المستخدمة.

عدد لرسائل قوائم الانتظار غير المستخدمة

من غير الممكن الحصول على عدد الرسائل في قائمة الانتظار غير المستخدمة على مستوى الموضوع. وذلك لأن الرسائل لا تجلس على مستوى الموضوع. بدلًا من ذلك، عندما يرسل المرسل رسالة إلى موضوع، يتم إعادة توجيه الرسالة إلى الاشتراكات للموضوع خلال ميلي ثانية، وبالتالي لم يعد موجودًا على مستوى الموضوع. لذلك، يمكنك مشاهدة الرسائل في DLQ المقترنة بالاشتراك للموضوع. في المثال التالي، يعرض Service Bus Explorer أن هناك 62 رسالة حاليًّا في DLQ للاشتراك في test1.

Image showing 62 messages in the dead-letter queue.

يمكنك أيضًا الحصول على عدد رسائل DLQ باستخدام الأمر Azure CLI: az servicebus topic subscription show .

نقل الرسائل إلى DLQ

هناك عدة أنشطة في Service Bus التي تتسبب في الحصول على دفع رسائل إلى DLQ من داخل مشغل الرسائل نفسه. يمكن أيضًا للتطبيق نقل الرسائل إلى DLQ بشكل صريح. يتم إضافة اثنين من الخصائص التالية (السبب غير المستخدم والوصف غير المستخدم) إلى رسائل غير المستخدمة. يمكن للتطبيقات تعريف تعليماتها البرمجية الخاصة لأسباب غير مستخدمة ولكن يقوم النظام بتعيين القيم التالية.

السبب غير المستخدم وصف الخطأ غير المستخدم
HeaderSizeExceeded تم تجاوز الحصة النسبية للحجم لهذا التدفق.
TTLExpiredException انتهت صلاحية الرسالة وكانت محذوفة. راجع قسم «Time to live» للحصول على التفاصيل.
معرف جلسة العمل فارغ. لا يسمح الكيان الممكن لجلسة العمل برسالة يكون معرف جلسة العمل الخاص بها خاليًا.
MaxTransferHopCountExceeded تم تجاوز الحد الأقصى لعدد الوثبات المسموح بها عند إعادة التوجيه بين قوائم الانتظار. تُعيّن هذه القيمة إلى 4.
MaxDeliveryCountExceeded تعذر استهلاك الرسالة بعد أقصى محاولات التسليم. راجع قسم «Maximum delivery count» للحصول على التفاصيل.

أقصى محاولات التسليم

هناك حد لعدد محاولات تسليم الرسائل لقوائم انتظار واشتراكات ناقل خدمة Microsoft Azure. القيمة الافتراضية هي 10. كلما تم تسليم رسالة في ظل تأمين التحرير السريع، ولكن تم التخلي عنها صراحةً أو انتهت صلاحية القفل ، يزداد عدد تسليم الرسائل. عند تجاوز عدد التسليم الحد، يتم نقل الرسالة إلى DLQ. يتم تعيين سبب الرسالة غير المستخدمة في DLQ إلى: MaxDeliveryCountExceeded. لا يمكن تعطيل هذا السلوك، ولكن يمكنك تعيين أقصى عدد للتسليم إلى رقم كبير.

حان الوقت للحياة

عند تمكين الحروف غير المستخدمة على قوائم الانتظار أو الاشتراكات، يتم نقل كافة الرسائل منتهية الصلاحية إلى DLQ. يتم تعيين التعليمة البرمجية للسبب غير المستخدمة إلى: TTLExpiredException.

لن يتم إزالة الرسائل المؤجلة ونقلها إلى قائمة الانتظار غير المستخدمة بعد انتهاء صلاحيتها. فهذا السلوك حسب التصميم.

أخطاء أثناء معالجة قواعد الاشتراك

إذا قمت بتمكين الحروف غير المستخدمة على استثناءات تقييم عامل التصفية، يتم السيطرة على أية أخطاء تقع أثناء تنفيذ قاعدة عامل تصفية SQL اشتراك في DLQ مع الرسالة المخالفة. لا تستخدم هذا الخيار في بيئة إنتاج لا تحتوي فيها جميع أنواع الرسائل على مشتركين.

حروف غير مستخدمة على مستوى التطبيق

بالإضافة إلى ميزات الأحرف غير المستخدمة المقدمة من قبل النظام، يمكن للتطبيقات استخدام DLQ لرفض الرسائل غير المقبولة بشكل صريح. ويمكن أن تتضمن الرسائل التي لا يمكن معالجتها بشكل صحيح بسبب أي مشكلة من مشاكل النظام أو الرسائل التي تحتوي على البيانات الأساسية المشوهة أو الرسائل التي تفشل المصادقة عند استخدام نظام أمان على مستوى الرسالة.

يمكن القيام بذلك عن طريق استدعاء طريقة ServiceBusReceiver.DeadLetterMessageAsync.

نوصي بتضمين نوع الاستثناء في DeadLetterReason وتتبع مكدس الاستثناء في DeadLetterDescription لأنه يسهل استكشاف سبب المشكلة وإصلاحها مما يؤدي إلى تحويل الرسائل إلى رسائل غير مستخدمة. يجب أن تدرك أن هذا قد يؤدي إلى تجاوز بعض الرسائل حد الحصة النسبية كيلوبايت 256 للمستوى القياسي ناقل خدمة Azure، مما يشير أيضا إلى أن المستوى المميز هو ما يجب استخدامه لبيئات الإنتاج.

الكتابة غير المستخدمة في سيناريوهات إعادة التوجيه التلقائي

يتم إرسال الرسائل إلى قائمة انتظار الرسائل غير المستخدمة في ظل الشروط التالية:

  • تمر الرسالة عبر أكثر من أربع قوائم انتظار أو مواضيع يتم ربطهما معًا.
  • تم تعطيل أو حذف قائمة الانتظار الوجهة أو الموضوع.
  • تتجاوز قائمة انتظار الوجهة أو الموضوع الحد الأقصى لحجم الكيان.

إرسال رسائل غير مستخدمة عبر السيناريوهات

  • إذا تم تعطيل قائمة انتظار الوجهة أو الموضوع، يتم إرسال الرسالة إلى قائمة انتظار نقل الأحرف غير المستخدمة (TDLQ) لقائمة انتظار المصدر.
  • إذا تم حذف قائمة انتظار الوجهة أو الموضوع، يتم رفع الاستثناء 404.
  • إذا تجاوزت قائمة انتظار الوجهة أو الكيان حجم الكيان، يتم إرسال الرسالة إلى TDLQ لقائمة انتظار المصدر.

المسار إلى قائمة انتظار غير مستخدمة

يمكنك الوصول إلى قائمة انتظار غير مستخدمة باستخدام بناء الجملة التالي:

<queue path>/$deadletterqueue
<topic path>/Subscriptions/<subscription path>/$deadletterqueue

إرسال رسائل غير مستخدمة لإعادة معالجتها

نظرا إلى أنه يمكن أن تكون هناك بيانات أعمال قيمة في الرسائل التي انتهت في قائمة انتظار الرسائل غير المستخدمة، فمن المستحسن إعادة معالجة هذه الرسائل عندما ينتهي المشغلون من التعامل مع الظروف التي تسببت في أن تكون الرسائل غير مستخدمة في المقام الأول.

تتيح أدوات مثل ناقل خدمة Azure Explorer النقل اليدوي للرسائل بين قوائم الانتظار والموضوعات. إذا كان هناك العديد من الرسائل في قائمة انتظار الرسائل غير المستخدمة التي تحتاج إلى نقلها، يمكن أن تساعد التعليمات البرمجية مثل هذه في نقلها جميعا في وقت واحد. غالبا ما يفضل المشغلون وجود واجهة مستخدم حتى يتمكنوا من استكشاف أخطاء أنواع الرسائل التي فشلت معالجتها، ومن أي قوائم انتظار المصدر، وأسباب ذلك، مع الاستمرار في القدرة على إعادة إرسال دفعات من الرسائل لإعادة معالجتها. توفر أدوات مثل ServicePulse مع NServiceBus هذه الإمكانات .

الخطوات التالية

راجع «Enable» الحروف غير المستخدمة لقائمة انتظار أو الاشتراك لمعرفة المزيد حول الطرق المختلفة لتكوين الحروف غير المستخدمة في إعداد انتهاء صلاحية الرسالة.