السياقات المحدودة وحدود الخدمات
السياقات المحدودة وحدود الخدمات
السؤال الأصعب في الميكروسيرفيسز ليس "كيف أنشر هذا؟" — بل "أين أقطع؟" إذا أخطأت في تحديد حدود الخدمات ستنتهي بـمونوليث موزّع: كل التكاليف التشغيلية للميكروسيرفيسز دون أي استقلالية. الأداة التي تُرشد تلك القطعة هي السياق المحدود (Bounded Context)، وهو مفهوم من كتاب Eric Evans حول Domain-Driven Design (DDD).
ما هو السياق المحدود؟
السياق المحدود هو منطقة في نطاق عملك تكون فيها نموذج معيّن محدّداً ومتسقاً. كلمة "محدود" هي الأساس: يمكن لنفس مصطلح الأعمال أن يعني شيئاً مختلفاً قليلاً في جزأين من المؤسسة. في منصة التجارة الإلكترونية، كلمة Customer تعني شخصاً يملك بيانات دفع لفريق الفوترة، وعنواناً لفريق الشحن، وسجل تصفح لفريق التوصيات. كل فريق يحتفظ بنموذجه الخاص — كلاس Customer خاص به بحقول وقواعد مختلفة.
يجب أن تُعيَّن الخدمة المصغرة لسياق محدود واحد أو تكون قسيمة منه. هذا يمنحك مبدأ عملياً موثوقاً: إذا كان التغيير في مفهوم أعمال واحد يتطلب تعديل كود في خدمتين، فالحدود على الأرجح خاطئة.
إيجاد الحدود: Event Storming عملياً
Event Storming هو تقنية ورشة تعاونية تسير فيها عبر النظام كسلسلة من أحداث النطاق — أشياء حدثت بصيغة الماضي: OrderPlaced وPaymentAuthorized وItemShipped. التجمّعات الطبيعية للأحداث والأوامر التي تُطلقها والتجمّعات (Aggregates) التي تمتلك الحالة تكشف السياقات المحدودة.
في نظام تجارة إلكترونية مبسّط، غالباً ما يكشف Event Storming عن هذه التجمّعات:
- Catalog — ProductCreated, PriceUpdated, ProductDeactivated
- Order — CartCreated, OrderPlaced, OrderCancelled
- Payment — PaymentAuthorized, PaymentFailed, RefundIssued
- Fulfillment — WarehousePickStarted, ItemShipped, DeliveryConfirmed
- Identity — UserRegistered, PasswordChanged, AccountLocked
كل تجمّع هو مرشّح للسياق المحدود وبالتالي مرشّح لحدود الخدمة.
ترجمة السياق المحدود إلى خدمة Spring Boot
بعد تحديد الحدود، تمتلك الخدمة نموذج بياناتها باستقلالية كاملة. إليك جذر التجمّع الخاص بخدمة Order — لاحظ أنها لا تحمل كائن Product كاملاً ولا كائن User كاملاً. تخزّن فقط المعرّفات التي تحتاجها من السياقات المجاورة، إضافة إلى snapshot محلية لاسم المنتج وقت تقديم الطلب لتكون معزولة عن تغييرات Catalog.
@ManyToOne في JPA يُعيّن لجدول قاعدة بيانات خدمة أخرى غير مقبول — فهو يقرن مخططات قاعدة البيانات ويُبطل الغرض من النشر المنفصل.
خريطة السياق: العلاقات بين الخدمات
لا تعيش السياقات المحدودة في عزلة؛ فهي تتفاعل. يُسمّي DDD أنماط العلاقة بينها. الأكثر شيوعاً في الميكروسيرفيسز هما:
- Customer/Supplier: سياق واحد (upstream) ينشر البيانات؛ والآخر (downstream) يستهلكها. الـ upstream يحدد العقد؛ الـ downstream يتكيّف. مثال: Catalog (upstream) ينشر أحداث المنتجات؛ Order (downstream) يشترك ويحتفظ بنسخته المحلية من المنتج.
- Anti-Corruption Layer (ACL): الـ downstream يُغلّف نموذج الـ upstream في طبقة ترجمة حتى يبقى نموذجه الداخلي نظيفاً. في الكود عادةً ما يكون هذا كلاس مُعيّن للتحويل أو واجهة منفذ مخصصة.
مبادئ التماسك والاقتران
قاعدة عملية مفيدة عند تقييم الحدود: الكود الذي يتغير معاً ينتمي إلى المكان نفسه (تماسك عالٍ)؛ والكود الذي لا يحتاج لمعرفة الآخر يجب ألّا يكون مرتبطاً به (اقتران منخفض). طبّقها على مرشّحي الخدمات:
- إذا كانت طلبات الميزات تمسّ دائماً خدمة واحدة فقط، فالحدود جيدة.
- إذا كان كل سبرينت يتضمن نشراً منسّقاً لثلاث خدمات من أجل قصة واحدة، ادمجها.
- إذا نمت خدمة لتصبح آلاف الأسطر وبات فريقها يتجادل حول الملكية، قسّمها.
الآثار الأمنية للحدود
حدود الخدمات هي أيضاً حدود أمنية. يجب أن تتحقق كل خدمة من الطلبات وتفوّضها باستقلالية — لا تثق ضمنياً أبداً بالبيانات القادمة من خدمة أخرى. في Spring Security 6، النمط الشائع هو تمرير JWT صادر من خدمة Identity والسماح لكل خدمة downstream بالتحقق منه باستقلالية:
تتحقق كل خدمة من توقيع JWT مقابل المفتاح العام لخدمة Identity (مستردّ من نقطة نهاية JWKS الخاصة بها). خدمة Order تستخرج مطالبة customerId — لا تستدعي قاعدة بيانات خدمة Identity مباشرة أبداً. هذا هو التعبير الأمني عن مبدأ السياق المحدود: كل خدمة تثق بالرمز المميّز، لا بجلسة مشتركة أو استدعاء قاعدة بيانات عبر الخدمات.
الخلاصة
السياق المحدود هو منطقة في نموذج نطاقك تكون فيها المصطلحات والقواعد متسقة. عيّن كل خدمة مرشحة لسياق محدود واحد، اجعلها تمتلك بياناتها باستقلالية (خزّن المعرّفات الخارجية لا الكائنات المشتركة)، نمذج العلاقات بين السياقات بخرائط السياق وطبقات Anti-Corruption، واستخدم تمرير JWT كجسر أمني. احصل على هذه الحدود صحيحة من البداية — إعادة هيكلتها لاحقاً هي إحدى أكلف العمليات في بنية الميكروسيرفيسز.