مقدمة: لماذا خدمة C# الخاصة بك ليست آلية مثالية
\n\nتخيل: لقد كتبت خدمة مصغرة أنيقة بلغة C#. اجتاز الكود مراجعة الكود، وغطت اختبارات الوحدة 95%، واختبارات التكامل خضراء. تقوم بنشرها في الإنتاج، وبعد 3 ساعات ينهار النظام. السبب؟ زيادة غير متوقعة في حركة المرور أرهقت مجموعة الخيوط، أو انقطاع مفاجئ لقاعدة البيانات لم تتوقعه.
\n\nمرحبًا بك في العالم الحقيقي، حيث تصبح هندسة الفوضى (Chaos Engineering) ليست رفاهية بل ضرورة. هذا ليس عن "تكسير كل شيء من أجل المتعة". إنه نظام يساعد في اكتشاف نقاط الضعف في الأنظمة الموزعة قبل أن يكتشفها المستخدمون.
\n\nفي هذه المقالة، سنشرح كيفية تطبيق هندسة الفوضى لتطبيقات C#: من النظرية إلى أمثلة الكود الحقيقية باستخدام مكتبات Polly و Simmy. ستتعلم كيفية إدخال الفوضى بشكل متعمد في خدمات .NET لزيادة مرونتها وقابليتها للتنبؤ.
\n\nما هي هندسة الفوضى ولماذا هي مهمة لـ .NET؟
\n\nهندسة الفوضى هي ممارسة إجراء تجارب على نظام موزع للتحقق من قدرته على تحمل الأعطال غير المتوقعة. Netflix، Amazon، Microsoft - جميع العمالقة يستخدمونها. بالنسبة لمطوري C#، هذا مهم بشكل خاص، حيث يتم استخدام .NET Core/5+ بشكل متزايد لبناء خدمات سحابية عالية التحميل على Microsoft Azure.
\n\nالمبادئ الأساسية لهندسة الفوضى:
\n- \n
- تحديد "الحالة المستقرة" (steady state) - كيف يتصرف نظامك في الظروف العادية (زمن الاستجابة، الإنتاجية، معدل الأخطاء). \n
- صياغة الفرضية - "إذا تعطلت قاعدة بيانات OrderDB، ستستمر خدمة الطلبات في الاستجابة بالبيانات المخزنة مؤقتًا لمدة 5 دقائق". \n
- إدخال الفوضى - تقوم فعليًا بإيقاف تشغيل OrderDB لمدة 30 ثانية. \n
- التحقق من الفرضية - ننظر إلى المقاييس. إذا لم يتم تأكيد الفرضية - فهناك خطأ في البنية. \n
الكلمة المفتاحية هنا هي "التجربة". أنت لا تأمل فقط في الأفضل، بل تثبت أن نظامك سينجو.
\n\nالأدوات اللازمة لهندسة الفوضى في C#
\n\nفي عالم .NET، هناك أداتان قويتان تعملان معًا:
\n- \n
- Polly - مكتبة لتنفيذ أنماط تحمل الأخطاء (Retry، Circuit Breaker، Timeout، Bulkhead Isolation). \n
- Simmy (Microsoft.Extensions.Resilience) - مكتبة لهندسة الفوضى، توسع Polly. تسمح بـ "حقن" الأعطال في سياساتك. \n
Simmy هو "الأخ الشرير" لـ Polly. إذا كانت Polly تعلم تطبيقك البقاء على قيد الحياة، فإن Simmy تتحقق من مدى إتقانه لذلك، عن طريق تعطيل الاستدعاءات عمدًا.
\n\nالتطبيق العملي: إعداد تجربة فوضى على C#
\n\nدعنا ننتقل إلى الكود. لنفترض أن لدينا خدمة حجز تتصل بواجهة برمجة تطبيقات دفع خارجية. نريد التحقق من سلوك BookingService إذا بدأت واجهة الدفع في الاستجابة بتأخير أو أخطاء.
الخطوة 1: تثبيت الحزم
\ndotnet add package Microsoft.Extensions.Http.Polly\ndotnet add package Microsoft.Extensions.Resilience\n\n\nالخطوة 2: إعداد HttpClient مع السياسات
\nأولاً، نقوم بإعداد سياسة Circuit Breaker و Retry القياسية باستخدام Polly. ثم نقوم "بتغليفها" في سياسة فوضى من Simmy.
\n\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Http.Resilience;\nusing Polly;\nusing Polly.Extensions.Http;\n\npublic static class ServiceCollectionExtensions\n{\n public static IServiceCollection AddPaymentClient(this IServiceCollection services)\n {\n services.AddHttpClient<IPaymentService, PaymentService>(client =&g