كيف يتعامل مطور واجهة خلفية بخبرة 3 سنوات مع فقدان الويب هوك ومعالجة البيانات المكررة في بيئة التطوير المحلية
إذا سبق لك التعامل مع تكامل المدفوعات أو الإشعارات في نظام موزع، فستكون حتماً مرهقاً من حالات فقدان البيانات أو إرسالها بشكل مكرر بسبب تأخر استجابات الخدمات الخارجية أو انقطاع الشبكة. نظراً لأن الويب هوك (Webhook) يضمن التسليم مرة واحدة على الأقل، فإن عدم جاهزية الخادم المستلم يؤدي بشكل مباشر إلى تلف البيانات. تتناول هذه المقالة كيفية محاكاة حالات الأعطال في البيئة المحلية وتنفيذ منطق الحماية قبل النشر في بيئة الإنتاج.
بناء محاكاة لأعطال الويب هوك الخارجي في بيئة التطوير المحلية
للتحقق من حالات الأعطال الواقعية قبل النشر، تحتاج إلى إنشاء خط أنابيب لاختبار الفوضى (Chaos Testing) في بيئتك المحلية. يتيح لك الجمع بين نفق ngrok و Toxiproxy القائم على Docker إعادة إنتاج مهلات الاستجابة وانقطاع الشبكة من المزودين الخارجيين. بناء هذه البيئة يقلل الوقت المستغرق في تحليل أسباب الأعطال والاستجابة لها بمقدار ساعتين.
إليك الخطوات المتبعة لحقن أخطاء الشبكة باستخدام Toxiproxy:
- قم بربط تطبيق الواجهة الخلفية و Toxiproxy و ngrok باستخدام Docker Compose، واضبط الطلبات الواردة إلى عنوان URL العام لـ ngrok لتمريرها عبر منفذ Toxiproxy رقم 8666 إلى المنفذ 8080 للتطبيق.
- أرسل طلب cURL إلى واجهة برمجة تطبيقات إدارة Toxiproxy لحقن تأخير في الاستجابة مدته 25000 ميللي ثانية، مما يؤدي إلى تفعيل شروط انتهاء المهلة للخدمات الخارجية مثل Stripe.
- قم بتطبيق ميزة
reset_peer toxic لإنهاء المقبس بالقوة والتحقق مما إذا تم استعادة مجموعة الاتصالات (Connection Pool) ورصد سجلات الأخطاء بنجاح.
تصميم قاعدة البيانات ومنطق التحقق لضمان الإدماج الذاتي (Idempotency)
تتسبب المعاملات المكررة الناتجة عن إعادة إرسال الويب هوك في تلف البيانات أثناء عملية الموافقة على الدفع. الذاكرة المؤقتة (Memory Cache) غير مناسبة لأنها لا تمنع ظروف السباق (Race Conditions) في بيئات الخوادم الموزعة. لضمان منع التكرار بشكل قاطع، يجب استخدام معاملات قواعد البيانات العلائقية (RDBMS) القيود الفريدة (Unique Constraints) كبوابة للإدماج الذاتي.
خطوات تنفيذ التحكم في طلبات التزامن على مستوى قاعدة البيانات هي كالتالي:
- أنشئ جدول
processed_webhooks وقم بتعيين قيد فريد (UNIQUE) على معرف الحدث الفريد الموجود داخل حمولة البيانات (Payload).
- في بيئة FastAPI و SQLAlchemy، استخدم عبارات الإدراج الذرية (Atomic Insert) لتسجيل الحالة على أنها "قيد المعالجة" والتقاط استثناء
IntegrityError عند حدوث تعارض في التزامن.
- في حالة انتهاك القيد الفريد، تحقق من حالة السجل الموجود؛ وإذا كان الطلب قد عولج مسبقاً، فقم بإرجاع رمز الحالة 200 OK دون تعديل البيانات لإيقاف إعادة الإرسال من الخدمة الخارجية. يمنع هذا الهيكل حوادث تلف البيانات الناتجة عن الطلبات المكررة.
ممارسة كتابة نص برمجي للاسترداد اليدوي لقائمة الانتظار الميتة (Dead Letter Queue)
عند حدوث أعطال في التبعيات الخارجية أثناء معالجة الويب هوك، تتراكم الأحداث التي تجاوزت حد إعادة المحاولات ويتم عزلها في قائمة الانتظار الميتة (DLQ). ترك هذه الأحداث الفاشلة دون معالجة يؤدي إلى تراكم عدم تناسق البيانات، لذا يلزم وجود عملية دفعية (Batch Process) لإعادة حقنها بأمان عند استقرار النظام. يتيح لك بناء نص برمجي للاسترداد اليدوي بناءً على لغة بايثون توفير 3 ساعات أسبوعياً من أعمال الاسترداد اليدوي عبر SQL.
إليك خطوات تنفيذ النص البرمجي الدفعي لإعادة معالجة الأحداث الفاشلة المعزولة:
- أنشئ جدول
dlq_webhooks لتسجيل الحمولة الأصلية، رسالة الخطأ، وعدد المحاولات، ثم استعلم عن البيانات التي تكون فيها قيمة is_resolved خاطئة (false).
- لتجنب ازدحام الشبكة أثناء إعادة المعالجة، انتظر لفترة تأخير محسوبة باستخدام خوارزمية التراجع الاسي (Exponential Backoff) والتشويش (Jitter).
- أرسل طلب HTTP إلى نقطة النهاية الداخلية، وقم بتحديث
is_resolved إلى صحيح (true) عند النجاح، أو قم زيادة عدد المحاولات عند الفشل مع وضع حد أقصى لمنع الدخول في حلقات غير نهائية.
إعداد عتبات تنبيه مراقبة الويب هوك ومعايير الاستجابة العملية
للحفاظ على استقرار نظام الويب هوك، تحتاج إلى نظام قابل للمراقبة لتتبع معدل فشل الاستلام وعدد الحالات المتراكمة في قائمة الانتظار الميتة في الوقت الفعلي. لمنع إرهاق مهندسي التناوب (On-call) بالتنبيهات الليلة الناتجة عن الاهتزازات المؤقتة في البنية التحتية، يجب وضع سياسات تنبيه هرمية تعتمد على طبيعة الخطأ.
خطوات ضبط المراقبة لتقليل الإنذارات الكاذبة والاستجابة للأعطال الحقيقية هي كالتالي:
- احسب معدل فشل الويب هوك بناءً على إجمالي عدد عمليات الاستلام خلال الست دقائق الماضية مقابل استجابات HTTP 5xx واستجابات انتهاء المهلة.
- قم بفصل وعرض أخطاء البنية التحتية المؤقتة وأخطاء منطق الأعمال بشكل مستقل على لوحة المعلومات (Dashboard).
- قم بتفعيل مكالمات PagerDuty الطارئة فقط عندما يتجاوز معدل الفشل 15 بالمائة وتتجاوز قائمة الانتظار الميتة 100 عنصر، واجعل حالات انتهاء المهلة البسيطة صامتة ليلاً لتقليل إرهاق فريق التناوب.