Get a quote

قواطع الدائرة والتدهور التدريجي في Go SaaS

كل تطبيق SaaS يعتمد على خدمات خارجية. في لبنان ومنطقة MENA، خدمات الدفع والرسائل النصية تواجه توقفات متقطعة. قواطع الدائرة هي نمط أساسي يمنع تراكم الأعطال وحماية التطبيق.

مشكلة الفشل المتسلسل في تطبيقات SaaS

كل تطبيق SaaS يعتمد على خدمات خارجية. في لبنان ومنطقة MENA، موثوقية الواجهات البرمجية للطرف الثالث تتفاوت بشكل ملحوظ. بوابات الدفع تتوقف في ساعات الذروة. مزودو الرسائل النصية يعانون من أعطال متقطعة. هذا ليس نظرياً، بل هو ما نواجهه فعلاً في منصة RTYLR عند التكامل مع معالجات الدفع الإقليمية ومزودي الرسائل النصية.

اعتماد خارجي واحد بطيء لا يؤثر فقط على الميزة التي تعتمد عليه. في معالج HTTP نموذجي بـ Go، مهلة 10 ثوانٍ على استدعاء بوابة SMS تعني 10 ثوانٍ من وقت goroutine المستهلك لكل طلب يمر بهذا المسار. تحت الحمل، تتراكم goroutines. تتسلق الذاكرة. تبدأ طلبات أخرى في الانتهاء بمهلة وهي تنتظر goroutine حرة. الفشل المتسلسل بدأ.

قواطع الدائرة هي الحل القياسي. تمنع الفشل المتسلسل عبر تقصير استدعاءات الاعتماد الفاشل قبل أن تستهلك الموارد.

الحالات الثلاث لقاطع الدائرة

قاطع الدائرة هو آلة حالة بثلاث حالات:

مغلق (التشغيل الطبيعي) الاستدعاءات تمر. القاطع يحصي الفشل. عندما يتجاوز الفشل حداً معيناً، يفتح القاطع.

مفتوح (الاعتماد يفشل) الاستدعاءات تُرفض فوراً دون محاولة الاستدعاء الحقيقي. المستدعي يحصل على خطأ في ميكروثوانٍ بدلاً من انتظار مهلة. بعد فترة تبريد، ينتقل القاطع إلى نصف مفتوح.

نصف مفتوح (استطلاع الاستعادة) يُسمح بطلب واحد. إذا نجح، يعود القاطع إلى مغلق. إذا فشل، يعود إلى مفتوح ويُعاد ضبط فترة التبريد.

الفهم الأساسي هو أن الحالة المفتوحة تقضي على تكلفة زمن الاستجابة لاعتماد فاشل. بدلاً من انتظار 10 ثوانٍ لمهلة، تحصل على خطأ في ميكروثوانٍ. مجموعة goroutines تبقى سليمة.

تطبيق مبسط في Go

مكتبة Go القياسية لا تتضمن قاطع دائرة. مكتبات مثل sony/gobreaker قوية، لكن فهم آلة الحالة الأساسية قيّم قبل الاعتماد على مكتبة خارجية.

الحالة StateOpen تعيد فوراً ErrCircuitOpen إذا لم تنقضِ فترة التبريد. الحالة StateHalfOpen تسمح بمحاولة واحدة. أي فشل في هذه الحالة يعيد القاطع إلى مفتوح.

في RTYLR، نستخدم sony/gobreaker مع إعدادات مخصصة لكل خدمة خارجية، مغلفة في محول خفيف يُعيّن أخطاءنا الداخلية.

استراتيجيات التدهور التدريجي

قاطع الدائرة يُخبرك أن الاعتماد غير متاح. التدهور التدريجي يُخبرك ماذا تفعل بدلاً من ذلك.

الاستجابات المخزنة مؤقتاً للواجهات البرمجية كثيفة القراءة (بيانات القائمة، التسعير)، قدّم آخر استجابة مخزنة عندما يكون الخادم غير متاح. البيانات قد تكون قديمة قليلاً، لكن المستخدم يحصل على استجابة.

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

وضع الوظائف المخفضة عندما يفشل اعتماد أساسي، اعترف بذلك. أعد استجابة منظمة تُخبر العميل بالميزات المتدهورة.

عزل مجموعات Goroutine

قاطع الدائرة يمنع تراكم goroutine بعد فتح القاطع. لكن قبل فتحه، الطلبات البطيئة لا تزال تتراكم. العزل يعزل الاعتمادات البطيئة حتى لا تستهلك ميزانية goroutine بالكامل.

التطبيق في Go هو semaphore لكل اعتماد. عندما يمتلئ، ErrBulkheadFull يُعطى فوراً. المستدعي يعرف على الفور أن الاعتماد مشبع ويمكنه التعامل مع ذلك.

في RTYLR، عميل بوابة SMS لديه عزل بـ 10 استدعاءات متزامنة. معالج الدفع لديه عزل بـ 20. هذه الأرقام مستمدة من أوقات استجابة p99 الملاحظة وميزانية goroutine لدينا.

مثال من الإنتاج في MENA

معالجات الدفع وبوابات SMS في المنطقة لها أنماط فشل محددة تستحق الفهم:

  • مشاكل DNS الإقليمية: بعض المزودين يستخدمون TTL لـ DNS يتفاعل بشكل سيء مع محلل Go الافتراضي. الاتصالات تفشل مع i/o timeout بدلاً من خطأ واضح.
  • تقييد الانفجار: مزودو SMS في المنطقة يفرضون حدوداً على الانفجار (100 SMS/دقيقة) غير موثقة بشكل جيد. تصطدم بها في ساعات الذروة.
  • نوافذ صيانة بوابة الدفع: معلنة للساعة الثانية صباحاً لكن أحياناً تبدأ مبكراً أو تمتد. قاطع دائرة يفتح عند 5 فشل متتالي يلتقط هذا خلال 5 ثوانٍ من بدء النافذة.

دروس من الإنتاج

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

هل تحتاج إلى مساعدة في البداية؟

إذا كنت تبني خلفية Go SaaS وتريد أنماط مرونة تصمد في الإنتاج في منطقة MENA، يمكن لـ Voxire مساعدتك في تصميمها وتطبيقها. تواصل معنا على https://voxire.com/get-a-quote/

العودة إلى المدونة
Chat on WhatsApp