31/07/2026
كنت بتشتري قبل كدة حاجة من Amazon وجيت عند خطوة الدفع ولقيتها مش شغالة؟ ال application كله شغال بس فيه جزء منه حصله مشكلة من غير ما باقي ال application يتأثر، بس ازاي؟
الطريقة الأكثر شهرة في بناء المشاريع الصغيرة والمتوسطة هي ال Monolithic Architecture، المشروع كله في codebase واحد محطوط جوا GitHub Repository مثلاً. سهل في التواصل بين أجزاء المشروع، بسيط في ال deployment ولكن مشاكله كتيرة، قراءة ملفات المشروع بتكون أصعب كل ما المشروع يكبر، لو حصل failure في جزء معين ال application كله هيقع لحد ما المشكلة تتحل، أي تعديل ولو بسيط بيحتاج أنك تعمل test لباقي الأجزاء عشان تتأكد ان التعديل مأثرش على أي جزء تاني، ال deployment هياخد وقت طويل ومكلف ومستهلك لل resources لأن أي تعديل بيحتاج انك تعمل re-deploy لل application كله.
ومن هنا جت فكرة الـ Microservices Architecture، بكل بساطة هنقسم ال application بتاعنا ل services وكل service هتكون مستقلة عشان نحقق مبدأ ال Separation of Concerns، بمعنى ان كل service مخصصة ل job واحدة بس، نقدر نستخدم tech stack مختلف لكل service ودي حاجة صعب جدا انها تتنفذ في ال Monolithic Architecture ومن هنا نقدر ناخد نقاط القوة الخاصة بكل tech stack عشان نستخدمها في الـ service المناسبة ليها.
عشان نقدر نخلي ال services تكلم بعضها فيه طرق كتيرة أبسطها نستخدم API Calls تعمل HTTP Requests تقدر تبعت وتستقبل ال data من وإلى باقي ال services، الطرق دي بتكون بطيئة لأنها معتمدة على ال network على عكس ال Monolith اللي بتستخدم ال Memory ف بتكون أسرع بكتير.
كدة ال application بقى scalable، محتاجين نعمل feature جديدة؟ نعمل service عشان تقدم ال feature دي من غير أي تأثير على الشغل القديم، بعد ما نخلص ال development نعمل test لل service لو تمام نعمل deploy لل service دي بس ومن هنا ممكن نلاقي كل service ب version مختلف زي كدة:
Shopping-Cart:V3.2
Payment:V4.1
Reviews:V1.0
على عكس ال Monolithic Architecture اللي هيكون version لل application كله من غير ما يكون واضح التغيير حصل فين.
عشان نقدر نجمع ال Services دي في GitHub مثلا قدامنا طريقتين:
1- Monorepo:
هنعمل Repository واحدة نجمع فيها كل ال Services، ميزتها ان لو فيه كود بيتكرر كتير زي Validation Logic، سهل نقدر نستخدمه في كذا Service بس لو المشروع كبير لدرجة ان ممكن يكون فيه اكتر من تيم شغال على Service واحدة بس فصعب بعدد ال Developers الكبير ده يشتغلوا على كل ال Services دي في نفس ال Repository
2- Polyrepo:
الطريقة دي بتخلينا نعمل Repository لكل Service، نقدر نشغل عدد كبير من ال Developers على نفس ال Service من غير Conflicts كتيرة، لو فيه كود بيتكرر بين ال Services فالموضوع هيكون أصعب شوية، هنحتاج نعمله في package مثلا وبعدها تقدر باقي ال Services تستخدمه وكل تحديث هيحتاج build جديد لل package دي
وفي النهاية مفيش Architecture احسن من التاني في كل حاجة ولكن هي Trade-offs على حسب مشروعك محتاج ايه، هل مشروع صغير فهنستخدم Monolith؟ ولا المشروع ضخم وناويين يبقى Scalable فنستخدم Microservices؟