هندسة البرمجيات للتوسع: الدروس المستفادة من بناء بنى تحتية للخدمات المصغرة
فريق هندسة كوجنس
2024-04-12
الانتقال من نظام متجانس (Monolith) إلى نظام يعتمد على الخدمات المصغرة (Microservices) لا يتعلق فقط بفصل الأكواد البرمجية عن بعضها؛ بل هو تغيير جوهري في كيفية إدارة حالة النظام، والتعامل مع الفشل، ومعالجة البيانات بشكل متزامن أو غير متزامن.
في هذه المقالة، نستعرض الدروس المستفادة من قيام فرقنا بهندسة أنظمة تعتمد على الأحداث (Event-Driven Architectures) قادرة على التعامل مع الآلاف من الطلبات في الثانية في بيئات الأعمال عالية المتطلبات.
التحدي: الاعتمادية في الأنظمة الموزعة
أحد أكبر المفاهيم الخاطئة حول الخدمات المصغرة هو أنها تحل مشاكل الأداء بطبيعتها. في الواقع، هي تحول المشكلة من التعقيد الداخلي إلى تعقيد شبكي وتواصلي.
عندما يقوم أحد عملائنا في قطاع الخدمات اللوجستية بالتبليغ عن بطء في النظام المتجانس الخاص به، كان السبب الجذري يكمن في تنافس عمليات قراءة وكتابة البيانات على قاعدة بيانات مركزية واحدة.
"في الأنظمة الموزعة، الفشل ليس احتمالية، بل هو واقع يجب التصميم من أجله."
استراتيجياتنا للتعامل مع التوسع
- فصل القراءة عن الكتابة (CQRS): لفصل الحمل عن قاعدة البيانات الرئيسية، قمنا بإنشاء مستودعات بيانات منفصلة للعمليات المعقدة وقراءات الواجهة الأمامية، يتم تزامنها عبر أحداث غير متزامنة (Kafka).
- العزل التام (Bulkheading): صُممت كل خدمة مصغرة لتمتلك قاعدة البيانات الخاصة بها والاعتماد على نفسها في اتخاذ القرارات الأساسية، حتى لو توقفت الخدمات المجاورة عن العمل.
- التراجع الذكي (Graceful Degradation): عند ارتفاع الحمل بشكل يتجاوز السعة القصوى، تقوم أنظمتنا بتقليل جودة أو كمية البيانات المسترجعة بدلاً من إسقاط النظام بالكامل، مما يضمن استمرارية الأعمال.
الاعتماد على الأحداث بدلاً من الاستدعاء المباشر
الاعتماد الواسع على بروتوكول HTTP أو gRPC بين الخدمات يؤدي إلى ربط قوي (Tight Coupling) يجعل النظام يعاني ككل إذا تباطأت خدمة واحدة.
من خلال اعتماد بنية تعتمد على الأحداث (Event-Driven Architecture)، تمكنا من:
- فصل الناشر عن المشترك، مما يسمح بإضافة ميزات جديدة دون المساس بالخدمات الأساسية.
- إعادة معالجة الأحداث (Event Replay) للتعافي من الأعطال وتدقيق البيانات بسهولة.
- تحقيق توسع ديناميكي (Auto-scaling) بناءً على حجم طوابير الانتظار وليس فقط معدل استهلاك المعالج (CPU).
الخلاصة
بناء منصات برمجية قابلة للتوسع ليس مجرد تمرين تقني؛ بل هو ضرورة حتمية للشركات التي تهدف إلى النمو السريع دون المساس بالموثوقية. في كوجنس، نتبنى هذه المبادئ في كل سطر برمجي نكتبه لبناء أنظمة تصمد أمام الزمن واختبارات الضغط.