تفاصيل العمل

قمت بتصميم وتنفيذ نظام لمعالجة الطلبات باستخدام Microservices Architecture وEvent-Driven Architecture بهدف دراسة كيفية التعامل مع Distributed Transactions في بيئة لا تشترك فيها الخدمات في نفس قاعدة البيانات.

النظام يتكون من عدة Services مستقلة، لكل Service قاعدة بيانات خاصة بها، وتتواصل الخدمات مع بعضها باستخدام RabbitMQ بدلًا من الاعتماد الكامل على synchronous HTTP communication.

تم تنفيذ دورة الطلب بحيث يمر عبر عدة مراحل: إنشاء الـ Order، حجز الـ Inventory، تنفيذ عملية الدفع، ثم إنشاء الـ Shipment.

أكبر تحدي كان التعامل مع الـ Distributed Transaction، لأن الـ Database Transaction التقليدية والـ Rollback لا يمكن استخدامها عبر قواعد بيانات مختلفة. لذلك تم استخدام Choreographed Saga Pattern مع Compensating Transactions للتعامل مع حالات الفشل وإرجاع النظام إلى حالة صحيحة.

تم أيضًا تطبيق Transactional Outbox Pattern لضمان عدم فقدان الـ Events في حالة نجاح عملية حفظ البيانات وفشل إرسال الـ Event إلى Message Broker.

ولمنع تنفيذ نفس الـ Event أكثر من مرة، تم تطبيق Idempotent Consumer Pattern باستخدام processed_events table وUnique Constraints، مما يمنع تكرار عمليات مثل Charging للمستخدم.

كما تم تطبيق Retry Mechanisms وDead Letter Queue (DLQ) للتعامل مع الرسائل التي تفشل في المعالجة بعد عدة محاولات.

تم اختبار النظام باستخدام Chaos Testing وLoad Testing، بما في ذلك إرسال آلاف الطلبات وإيقاف إحدى الخدمات أثناء تنفيذ العمليات للتأكد من قدرة النظام على استكمال العمل والتعامل مع الـ failures بدون فقدان الطلبات أو تنفيذ العمليات المالية بشكل متكرر.

المشروع تم تنفيذه باستخدام Spring Boot وNestJS وLaravel، مع RabbitMQ وقواعد بيانات مستقلة لكل Service، وتم توثيق القرارات المعمارية باستخدام ADRs بالإضافة إلى Architecture Diagrams.

بطاقة العمل

اسم المستقل
عدد الإعجابات
0
تاريخ الإضافة
المهارات