معالجة الأخطاء وإعادة المحاولة
عالجوا الأعطال باستخدام إعادة المحاولة وقوائم الانتظار للرسائل الميتة
معالجة الأخطاء وإعادة المحاولة درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
الفشل أمر طبيعي
قد يفشل المستهلكون بسبب خطأ مؤقت في قاعدة البيانات، أو انتهاء مهلة خدمة تابعة، أو وجود خطأ في البيانات غير الصالحة. يوفّر MassTransit أدوات متعددة الطبقات، مثل إعادة المحاولة وإعادة التسليم وقوائم أخطاء، لمعالجة حالات الفشل بسلاسة بدلًا من فقدان الرسائل.
إعادة المحاولة الفورية
للانقطاعات القصيرة، اضبط إعادة المحاولة كي يعيد MassTransit معالجة الرسالة عدة مرات متتالية وبسرعة قبل التوقف.
cfg.ReceiveEndpoint("orders", e =>
{
e.UseMessageRetry(r => r.Immediate(3));
e.ConfigureConsumer<OrderConsumer>(context);
});إعادة المحاولة بفواصل زمنية وتزايد أسي
يساعد توزيع محاولات إعادة المحاولة زمنيًا عندما يستغرق التعافي وقتًا أطول. استخدم الفواصل الزمنية أو التراجع الأسي، على غرار Polly.
e.UseMessageRetry(r =>
r.Exponential(5,
minInterval: TimeSpan.FromSeconds(1),
maxInterval: TimeSpan.FromMinutes(1),
intervalDelta: TimeSpan.FromSeconds(2)));تصفية الأخطاء التي تستدعي إعادة المحاولة
أعد المحاولة عند الاستثناءات المؤقتة فقط؛ ولا تعاود المحاولة عند الأخطاء الدائمة مثل فشل التحقق من الصحة. استخدم Handle وIgnore لتحديد نطاق إعادة المحاولة.
e.UseMessageRetry(r =>
{
r.Handle<TimeoutException>();
r.Ignore<ValidationException>();
r.Immediate(3);
});Retry مقابل Redelivery
يُبقي Retry الرسالة في الذاكرة ويعيد معالجتها بسرعة. أما Redelivery (إعادة المحاولة المؤجلة أو من المستوى الثاني) فتعيد الرسالة إلى وسيط الرسائل لتُسلّم مرة أخرى بعد وقت أطول بكثير، مما يحرر المستهلك في هذه الأثناء.
e.UseDelayedRedelivery(r =>
r.Intervals(TimeSpan.FromMinutes(5),
TimeSpan.FromMinutes(15),
TimeSpan.FromMinutes(30)));الجمع بين الطبقتين
يستخدم الإعداد المتين إعادة المحاولة الفورية للانقطاعات القصيرة، وإعادة التسليم المؤجلة للانقطاعات الأطول. اضبط إعادة التسليم خارج إعادة المحاولة حتى تحصل كل محاولة إعادة تسليم على محاولاتها الفورية الخاصة.
e.UseDelayedRedelivery(r => r.Intervals(
TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(15)));
e.UseMessageRetry(r => r.Immediate(3));قائمة انتظار الأخطاء
عند استنفاد جميع محاولات إعادة المحاولة وإعادة التسليم، ينقل MassTransit الرسالة إلى قائمة انتظار الأخطاء المسماة <queue>_error. وتُحفظ الرسالة مع تفاصيل الاستثناء للتحقيق فيها، ولا تُهمل بصمت مطلقًا.
الأعطال
عند الفشل، ينشر MassTransit أيضًا حدثًا من نوع Fault<T>. ويمكن للخدمات الأخرى استهلاك الأعطال لإرسال التنبيهات أو تسجيلها أو تشغيل التعويض.
public class OrderFaultConsumer : IConsumer<Fault<OrderPlaced>>
{
public Task Consume(ConsumeContext<Fault<OrderPlaced>> context)
{
// inspect context.Message.Exceptions
return Task.CompletedTask;
}
}أهمية idempotency
نظرًا إلى أن إعادة المحاولة وإعادة التسليم قد تؤديان إلى معالجة الرسالة أكثر من مرة، يجب أن يكون المستهلكون idempotent: أي إن معالجة الرسالة نفسها مرتين يجب ألا تؤدي إلى تحصيل المبلغ مرتين أو تكرار العمل. استخدم معرّفات فريدة وفحوصات لإزالة التكرار.
إعادة تشغيل الرسائل من قائمة انتظار الأخطاء
بعد إصلاح خطأ، يمكنك نقل الرسائل من قائمة انتظار الأخطاء إلى قائمة الانتظار الأصلية لإعادة معالجتها، واستعادة العمل الذي فشل سابقًا.
قوائم انتظار الرسائل الميتة والمتخطاة
يستخدم MassTransit أيضًا قائمة انتظار skipped (_skipped) للرسائل التي لم يرغب أي مستهلك في معالجتها، مما يساعدك على اكتشاف أنواع الرسائل التي وُجّهت بشكل خاطئ أو غير المتوقعة في بيئة الإنتاج.
تحقق سريع
اختبر معالجة الأخطاء وإعادة المحاولة.
مراجعة
يستخدم MassTransit طبقات لمعالجة حالات الفشل: إعادة المحاولة (الفورية أو الأسية، مع تحديد نطاقها باستخدام Handle/Ignore) للانقطاعات القصيرة، وإعادة التسليم للانقطاعات الأطول، وقائمة انتظار الأخطاء للرسائل التي استُنفدت محاولاتها، بالإضافة إلى أحداث Fault<T> لإرسال التنبيهات. ونظرًا إلى إمكانية معالجة الرسائل أكثر من مرة، احرص على أن يكون المستهلكون idempotent، وأعد تشغيل الرسائل من قائمة انتظار الأخطاء بعد إصلاح الأخطاء.
الأسئلة الشائعة
هل درس «معالجة الأخطاء وإعادة المحاولة» مجاني؟
نعم — نص درس «معالجة الأخطاء وإعادة المحاولة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «معالجة الأخطاء وإعادة المحاولة»؟
عالجوا الأعطال باستخدام إعادة المحاولة وقوائم الانتظار للرسائل الميتة تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «معالجة الأخطاء وإعادة المحاولة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مفاهيم المراسلة
- إنتاج الرسائل واستهلاكها
- Saga ومسارات العمل
- معالجة الأخطاء وإعادة المحاولة