تصحيح بتاريخ 24 سبتمبر 2026: أزلنا نسب الانتشار والتوفير غير المدعومة بمصادر، واستبدلنا الصور المفقودة بجدول مقارنة، ووضحنا المفاضلات المعمارية.
حدد حدود الخدمات انطلاقاً من مشكلة واضحة
تتيح الخدمات المصغرة نشر أجزاء التطبيق وتوسيع مواردها بصورة مستقلة، لكنها تضيف اتصالات شبكية وعمليات نشر منفصلة وأعباء تشغيلية. أما التطبيق الأحادي المعياري فيحافظ على حدود واضحة بين الوحدات داخل تطبيق واحد يُنشر معاً. ولا يضمن أي خيار وحده خفض التكلفة أو تحسين الاعتمادية.
يوضح دليل Microsoft المعماري الفوائد والتحديات، ومنها اتساق البيانات والاختبار وزمن الاتصال. ويتطلب عزل الأعطال أن تتعامل الخدمات المستدعية مع تعطل اعتمادياتها؛ فصل العمليات وحده لا يمنع انتقال الفشل.
قارن نموذج التشغيل
| القرار | التطبيق الأحادي المعياري | الخدمات المصغرة |
|---|---|---|
| النشر | تُنشر الوحدات معاً ضمن تطبيق واحد. | يمكن نشر الخدمات منفصلة إذا بقيت الواجهات متوافقة. |
| التوسع | توسيع التطبيق أو عمال المعالجة الخلفية. | توسيع خدمات محددة بحسب أحمالها. |
| تغيير البيانات | قد تُبسّط قاعدة بيانات مشتركة تدعم المعاملات التغييرات بين الوحدات. | تتطلب ملكية البيانات المنفصلة تنسيقاً صريحاً بين الخدمات. |
| تتبع الأخطاء | حدود شبكية أقل للفحص. | تزداد أهمية ربط السجلات والمقاييس والتتبع الموزع. |
| المسؤولية | قد يناسب النشر الموحد فريقاً صغيراً ذا مسؤوليات مشتركة. | تحتاج كل خدمة إلى مسؤول واضح عن الصيانة والحوادث. |
دوّن أسباب القرار
تشرح مقالة مارتن فاولر البدء بتطبيق أحادي كيف يمكن لهذا النهج مساعدة الفريق على اكتشاف حدود المجال قبل توزيعها. وهو رأي معماري يستند إلى الخبرة، وليس قاعدة شاملة أو إحصائية عن الانتشار.
نقترح أربعة أسئلة: ما الاختناق الذي قسناه ونريد معالجته؟ ما الذي يجب نشره مستقلاً؟ من سيشغّل الخدمة الجديدة؟ وماذا يحدث عند تعطلها؟ إذا لم تتضح الإجابات، فإن تحسين حدود الوحدات داخل التطبيق الحالي خطوة أولى مفيدة.
خطط لاتساق البيانات والتعافي
لا تشمل معاملة محلية في قاعدة بيانات خدمةً أخرى تلقائياً. ينسق نمط تنسيق Saga المعاملات المحلية والإجراءات التعويضية، لكنه يضيف اعتبارات لإعادة المحاولة واتساق البيانات. استرداد مبلغ أو إلغاء حجز سلوك تجاري يحتاج إلى تصميم، وليس زر تراجع عام.
عندما يتطلب تحديث قاعدة البيانات نشر حدث أيضاً، يعالج نمط Transactional Outbox خطر نجاح عملية كتابة وفشل الأخرى. وتظل معالجة الرسائل المتكررة مسؤولية الجهة المستقبلة.
مثال توضيحي على حمل يعتمد على الذكاء الاصطناعي
تخيّل تطبيقاً تحتاج فيه معالجة المستندات إلى وحدات GPU، بينما تعمل صفحات الحسابات على خوادم ويب عادية. قد يتيح فصل عامل المعالجة توسعاً ونشراً مستقلين. ولا يتطلب ذلك تحويل إدارة الحسابات والفوترة وكل الوحدات الأخرى إلى خدمات منفصلة. هذا مثال افتراضي وليس نتيجة مشروع لعميل.
حدد مسؤولية المهام ومهل الانتظار وحدود إعادة المحاولة والحالة التي يراها المستخدم عند الفشل. قِس تأخر الطابور والمهام الفاشلة قبل إضافة حدود جديدة للخدمات.
قيّم فصل خدمة واحدة قبل التوسع
- سجّل زمن الاستجابة وتكرار النشر وجهد معالجة الحوادث والتكلفة التشغيلية الحالية.
- اختر حداً واحداً لخدمة لها مسؤول واضح وخطة طرح يمكن التراجع عنها.
- حدد عقد واجهة API أو الأحداث واختبر تعطل الاعتماديات.
- قارن النتائج بالوضع السابق، مع احتساب وقت التطوير والدعم.
استخدم هذه الأدلة لتحديد الخطوة التالية. لا تقدم المقالة نسباً عامة للانتشار أو العودة إلى التطبيقات الأحادية أو توفيراً مضموناً في التكلفة.
