الخدمات المصغرة مقابل المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ©: أيهما الأنسب لمنتج SaaS الخاص بك؟
النقاش ØÙˆÙ„ الخدمات المصغرة مقابل المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© له إجابة ÙˆØ§Ø¶ØØ© لمعظم منتجات SaaS — وليست ما يتوقعه معظم الناس. Ù†ØÙ„Ù„ متى تتÙوق كل معمارية، وما هي التكالي٠الØÙ‚يقية، وما الذي نوصي به ÙØ¹Ù„اً للعملاء الذين يبنون منصات SaaS اليوم.
هذا ما نسمعه بانتظام من المؤسسين الذين يبنون منتجات SaaS جديدة: "نريد البدء بالخدمات المصغرة من اليوم الأول. هذا هو الأسلوب الصØÙŠØ ÙÙŠ البناء، أليس كذلك؟"
إجابتنا، ÙÙŠ غالب الأØÙŠØ§Ù†ØŒ هي لا.
ليس لأن الخدمات المصغرة سيئة. Ùهي قوية ÙØ¹Ù„اً ونبنيها بانتظام. لكن معظم Ø§Ù„ÙØ±Ù‚ التي تتعامل مع الخدمات المصغرة باعتبارها الخيار Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ Ø§Ù„ØØ¯ÙŠØ« ØªÙØ¹Ùدّ Ù†ÙØ³Ù‡Ø§ لإطلاق أبطأ، وتجربة تصØÙŠØ أخطاء أصعب، وتكالي٠تشغيلية أعلى بكثير — وكل ذلك قبل أن يكون لديها عميل ÙˆØ§ØØ¯ ÙŠØ¯ÙØ¹ أو ملاءمة مثبتة للسوق.
ظل النقاش ØÙˆÙ„ الخدمات المصغرة مقابل المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© صاخباً ÙÙŠ مجتمع الهندسة البرمجية لما يقارب عقداً من الزمن. أسهمت Ù…ØØ§Ø¯Ø«Ø§Øª المؤتمرات والمدونات التقنية والإعلانات الوظيÙية مجتمعةً ÙÙŠ بناء انطباع Ù…ÙØ§Ø¯Ù‡ أن الخدمات المصغرة هي الخيار المتطور وقابل التوسع والجاد، وأن المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© بقايا من ØÙ‚بة أقل نضجاً. هذا الإطار مضلل، ونريد أن نكش٠ØÙ‚يقته.
ÙÙŠ هذا الدليل Ø³Ù†Ø´Ø±Ø ÙƒÙ„ØªØ§ المعماريتين بصدق، ونستعرض التكالي٠التشغيلية الØÙ‚يقية التي نادراً ما ÙŠÙØ°ÙƒØ± ÙÙŠ خطاب مؤيدي الخدمات المصغرة، ÙˆÙ†ØØ¯Ø¯ الشروط التي تتÙوق Ùيها كل منهجية ÙØ¹Ù„اً، ونخبرك بالضبط بما نوصي به عملاءنا ØÙŠÙ† يأتوننا لبناء منتج SaaS.
ما هي المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ©ØŸ
المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© هي تطبيق تتمركز Ùيه كل الوظائ٠— إدارة المستخدمين، والÙواتير، ومنطق الأعمال، والإشعارات، والتقارير — ÙÙŠ ÙˆØØ¯Ø© نشر ÙˆØ§ØØ¯Ø©. تبنيها وتنشرها كشيء ÙˆØ§ØØ¯ØŒ وعادةً تشترك ÙÙŠ قاعدة بيانات ÙˆØ§ØØ¯Ø©.
هذا Ø§Ù„ÙˆØµÙ ÙˆØØ¯Ù‡ كاÙ٠لجعل كلمة "معمارية Ø£ØØ§Ø¯ÙŠØ©" تبدو قيداً، لكن هذا الرد هو سوء Ùهم يستØÙ‚ المعالجة المباشرة. المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© ليست كرة من الطين الÙوضوي. ليست كوداً قديماً يتماسك بشريط لاصق. إنها خيار معماري — وهو بالمناسبة الأسلوب الذي بÙنيت به GitHub ÙˆShopify ÙˆStack Overflow ÙˆBasecamp وتوسعت لتخدم قواعد مستخدمين ضخمة.
الشيء المهم هو أن المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© لا تعني غياب الهيكلية. المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© المبنية جيداً لها ØØ¯ÙˆØ¯ ÙˆØØ¯ÙˆÙŠØ© داخلية ÙˆØ§Ø¶ØØ©ØŒ وواجهات Ù…ØØ¯Ø¯Ø© بين المكونات، ÙˆÙØµÙ„ منضبط للاهتمامات. الكود المسؤول عن المدÙوعات لا يتطÙÙ„ مباشرةً على الكود المسؤول عن جلسات المستخدمين. Ø§Ù„ÙˆØØ¯Ø§Øª Ù…Ù†ÙØµÙ„Ø© منطقياً ØØªÙ‰ وإن كانت تعمل ÙÙŠ Ù†ÙØ³ العملية.
تستÙيد المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© أيضاً من البساطة ÙÙŠ عدة مجالات أساسية: هناك قاعدة كود ÙˆØ§ØØ¯Ø© للتنقل Ùيها، وخط نشر ÙˆØ§ØØ¯ للصيانة، ومكان ÙˆØ§ØØ¯ لوضع نقطة توق٠عند ØØ¯ÙˆØ« خطأ ما، وعمليات قاعدة بيانات تعمل عبر التطبيق بأكمله دون أي بنية تنسيق إضاÙية.
ما هي الخدمات المصغرة؟
معمارية الخدمات المصغرة تÙÙكك التطبيق إلى مجموعة من الخدمات الصغيرة القابلة للنشر بشكل مستقل، كل منها مسؤولة عن قدرة أعمال Ù…ØØ¯Ø¯Ø©. قد تنقسم منصة SaaS للتجارة الإلكترونية إلى خدمة طلبات، وخدمة مخزون، وخدمة مدÙوعات، وخدمة إشعارات، وخدمة مستخدمين — كل منها تعمل كعملية مستقلة بدورة نشر خاصة وقاعدة بيانات خاصة.
تتواصل الخدمات عبر الشبكة، عادةً باستخدام REST APIs أو gRPC أو طوابير الرسائل مثل RabbitMQ أو Apache Kafka. الإجراء الذي كان يعني سابقاً استدعاء دالة داخل المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© يعني الآن إرسال طلب شبكة بين خدمتين Ù…Ù†ÙØµÙ„تين — أو نشر ØØ¯Ø« تستهلكه خدمة ÙˆØ§ØØ¯Ø© أو أكثر بشكل غير متزامن.
الجاذبية ØÙ‚يقية. النشر المستقل يعني إمكانية إصدار تغيير ÙÙŠ خدمة المدÙوعات دون المساس بخدمة الطلبات. التوسع المستقل يعني توÙير طاقة أكبر للخدمة Ø§Ù„ÙˆØ§ØØ¯Ø© التي تتØÙ…Ù„ الØÙ…Ù„ بدلاً من توسيع التطبيق بأكمله. التطوير متعدد اللغات يعني أن خدمات Ù…Ø®ØªÙ„ÙØ© يمكنها استخدام لغات أو أطر Ù…Ø®ØªÙ„ÙØ© إذا كان Ù„Ù„ÙØ±ÙŠÙ‚ سبب مشروع. ÙˆØ§Ù„ØØ¯ÙˆØ¯ Ø§Ù„Ù…ØØ¯Ø¯Ø© Ø¨ÙˆØ¶ÙˆØ Ø¨ÙŠÙ† الخدمات ØªÙØ±Ø¶ نوعاً من الانضباط الهيكلي الذي يمكن أن يجعل قاعدة كود كبيرة أسهل إدارةً عبر ÙØ±Ù‚ متعددة.
هذه الÙوائد ØÙ‚يقية. السؤال هو ما إذا كانت تستØÙ‚ التكالي٠— والتكالي٠أعلى بكثير مما يعتر٠به معظم الخطاب.
التكالي٠الØÙ‚يقية للخدمات المصغرة
هذا هو القسم الذي يتخطاه معظم Ø§Ù„Ù…Ø¯Ø§ÙØ¹ÙŠÙ† عن الخدمات المصغرة بسرعة. نريد أن نقضي وقتاً ØÙ‚يقياً هنا، لأن هذا هو المكان الذي تقع Ùيه المشاريع ÙÙŠ ورطة.
التعقيد التشغيلي ليس تراكمياً — بل أسي. كل خدمة ØªØØªØ§Ø¬ إلى خط CI/CD خاص بها، وإعداد ØØ§ÙˆÙŠØ§Øª خاص، ومتغيرات بيئة خاصة، ÙˆÙØÙˆØµØ§Øª ØµØØ© خاصة، واستراتيجية نشر خاصة. لخمس خدمات هذا يعني خمسة من كل شيء. لخمس عشرة خدمة ØªØµØ¨Ø Ù‡Ø°Ù‡ ÙˆØ¸ÙŠÙØ© هندسة بنية ØªØØªÙŠØ© بدوام كامل.
التتبع الموزع صعب ÙØ¹Ù„اً. عندما يتسبب خطأ ÙÙŠ ÙØ´Ù„ طلب مستخدم ÙÙŠ المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ©ØŒ لديك تتبع مكدس ÙˆØ§ØØ¯ يخبرك بالضبط بما ØØ¯Ø«. ÙÙŠ معمارية الخدمات المصغرة، قد يكون Ù†ÙØ³ الطلب قد لمس أربع خدمات. قد يظهر الخطأ ÙÙŠ الخدمة الثالثة، ويظهر على Ø§Ù„Ø³Ø·Ø ÙÙŠ الرابعة، ÙˆÙŠÙØ³Ø¬ÙŽÙ‘Ù„ بصيغة لا تطابق الأخريات. ØªØØªØ§Ø¬ إلى أدوات تتبع موزع مناسبة — OpenTelemetry ÙˆJaeger ÙˆDatadog APM — ÙˆØ§Ù„ÙØ±ÙŠÙ‚ ÙŠØØªØ§Ø¬ إلى Ù…Ø¹Ø±ÙØ© استخدامها. هذا عبء لا وجود له ÙÙŠ المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ©.
زمن استجابة الشبكة يتراكم. استدعاءات الدوال داخل المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© تÙقاس بالميكروثانية. استدعاءات HTTP بين الخدمات تÙقاس بالميلي ثانية. ÙÙŠ معمارية كثيرة الاتصالات البينية مع العديد من الاستدعاءات بين الخدمات لكل طلب مستخدم، يتراكم هذا الزمن. يمكنك تخÙÙŠÙÙ‡ بالتخزين المؤقت والأنماط غير المتزامنة، لكن كلاهما ÙŠÙØ¯Ø®Ù„ تعقيداً إضاÙياً.
اتساق البيانات عبر ØØ¯ÙˆØ¯ الخدمات مشكلة صعبة. ÙÙŠ المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ©ØŒ عملية قاعدة البيانات ذرية — إما أن يتم التزام كل شيء أو لا شيء. عندما يعيش جزءان مترابطان من البيانات ÙÙŠ قاعدتي بيانات لخدمتين Ù…Ù†ÙØµÙ„تين، تÙقد هذا الضمان. الØÙاظ على اتساق البيانات يتطلب أنماطاً مثل نمط SagaØŒ أو المعاملات الموزعة، أو الاتساق التدريجي — وكلها تتطلب تصميماً دقيقاً واختباراً دقيقاً.
تصØÙŠØ الأخطاء أصعب على كل المستويات. استنساخ مشكلة إنتاج تمتد عبر خدمات متعددة يتطلب تنسيق السجلات والتتبعات ÙˆØ§Ù„ØØ§Ù„Ø© عبر عدة أنظمة. ما يستغرق ثلاثين دقيقة لتصØÙŠØÙ‡ ÙÙŠ معمارية Ø£ØØ§Ø¯ÙŠØ© قد يستغرق أياماً ÙÙŠ معمارية خدمات مصغرة Ø¶Ø¹ÙŠÙØ© Ø§Ù„ØªØØ³Ø³.
ØªÙƒÙ„ÙØ© تنسيق Ø§Ù„ÙØ±ÙŠÙ‚ ØÙ‚يقية. إذا كان ÙØ±ÙŠÙ‚ يملك خدمة الطلبات ÙˆÙØ±ÙŠÙ‚ آخر يملك خدمة المخزون، ÙØ¥Ù† ميزة تلمس كليهما تتطلب مزامنة بين Ø§Ù„ÙØ±ÙŠÙ‚ين. كل تغيير ÙÙŠ عقد الخدمة البينية هو ØªÙØ§ÙˆØ¶. إصدار API ÙŠØµØ¨Ø Ø§Ù‡ØªÙ…Ø§Ù…Ø§Ù‹ دائماً.
لا شيء من هذه التكالي٠مميت لمنظمة هندسية ناضجة بالأدوات الصØÙŠØØ© ÙˆØØ¬Ù… Ø§Ù„ÙØ±ÙŠÙ‚ المناسب. لكن Ù„ÙØ±ÙŠÙ‚ SaaS ÙÙŠ مراØÙ„Ù‡ المبكرة من ثلاثة إلى ثمانية مهندسين ÙŠØØ§ÙˆÙ„ الشØÙ† بسرعة والتكرار على منتج قد يتمØÙˆØ± ثلاث مرات قبل إيجاد سوقه — Ùهي ÙÙŠ الغالب مميتة.
متى تتÙوق المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ©
المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© هي الخيار الصØÙŠØ ÙÙŠ جميع Ø§Ù„ØØ§Ù„ات التالية، ومعظم منتجات SaaS المبكرة المرØÙ„Ø© تنطبق عليها عدة منها ÙÙŠ Ø¢Ù†Ù ÙˆØ§ØØ¯.
أنت ÙÙŠ مرØÙ„Ø© ما قبل الملاءمة مع السوق. إذا لم تكن تعر٠بعد بالضبط من هم مستخدموك، وما الذي Ø³ÙŠØ¯ÙØ¹ÙˆÙ† مقابله، وأي الميزات ØªØ¯ÙØ¹ Ø§Ù„Ø§ØØªÙاظ ÙØ¹Ù„اً، ÙØ³ØªØºÙŠØ± نموذج بياناتك ومنطق أعمالك وتدÙقات المستخدمين بشكل متكرر. المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© تجعل هذا النوع من التكرار سريعاً. الخدمات المصغرة تجعله مؤلماً.
ÙØ±ÙŠÙ‚Ùƒ أقل من عشرة مهندسين. الÙوائد التنظيمية للخدمات المصغرة — Ø§Ù„Ø³Ù…Ø§Ø Ù„ÙØ±Ù‚ كبيرة متعددة بالعمل باستقلالية — ببساطة لا تنطبق على Ø§Ù„ÙØ±Ù‚ الصغيرة. ÙØ±ÙŠÙ‚ من خمسة أشخاص يعمل ÙÙŠ قاعدة كود ÙˆØ§ØØ¯Ø© منظمة بشكل جيد أكثر إنتاجية من ÙØ±ÙŠÙ‚ من خمسة يدير خمس خدمات بكل ما يترتب عليها من عبء.
لديك قيود ضيقة على الميزانية أو مدة التشغيل. بنية الخدمات المصغرة تكل٠أكثر للتشغيل والإدارة. على AWSØŒ تشغيل عشر خدمات Ù…Ù†ÙØµÙ„Ø© بتكرار مناسب وأدوات رصد سيكل٠بشكل ملØÙˆØ¸ أكثر كل شهر من تشغيل تطبيق ÙˆØ§ØØ¯ Ù…ÙØ¬Ù‡ÙŽÙ‘ز بشكل جيد. عندما تكون مدة التشغيل Ù…ØØ¯ÙˆØ¯Ø©ØŒ يهم هذا Ø§Ù„ÙØ§Ø±Ù‚.
متطلبات التوسع لديك ليست خاصة بخدمة. إذا كان عنق الزجاجة هو التطبيق بأكمله وليس مكوناً معزولاً ÙˆØ§ØØ¯Ø§Ù‹ØŒ ÙØ¥Ù† ØØ¬Ø© التوسع المستقل للخدمات المصغرة لا تنطبق.
النمط الذي نوصي به ÙÙŠ هذه Ø§Ù„ØØ§Ù„ات هو المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© المعيارية: تطبيق قابل للنشر ÙƒÙˆØØ¯Ø© ÙˆØ§ØØ¯Ø© مع ØØ¯ÙˆØ¯ ÙˆØØ¯ÙˆÙŠØ© داخلية Ù…ÙØ±ÙˆØ¶Ø© بصرامة. ØªØØµÙ„ على بساطة تشغيل المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© والانضباط الهيكلي الذي يجعل استخراج الخدمات ممكناً لاØÙ‚اً، دون تعقيد الأنظمة الموزعة التي لست مستعداً لإدارتها بعد.
متى تكون الخدمات المصغرة منطقية
الخدمات المصغرة ليست الخيار الخاطئ عالمياً — إنها الخيار الخاطئ عند تطبيقها ÙÙŠ وقت مبكر. هناك شروط ÙˆØ§Ø¶ØØ© تكون Ùيها الأداة الصØÙŠØØ© ÙØ¹Ù„اً.
لديك ÙØ±Ù‚ هندسية كبيرة ومستقلة. إذا كان لديك منظمة هندسية من عشرين شخصاً ØÙŠØ« تملك ÙØ±Ù‚ متمايزة مجالات منتج متمايزة، ØªØªÙŠØ Ø§Ù„Ø®Ø¯Ù…Ø§Øª المصغرة لكل ÙØ±ÙŠÙ‚ امتلاك مجموعتها الكاملة: قاعدة الكود، وخط النشر، ودوران المناوبة، وإيقاع الإصدار. هذا الاستقلال مضاع٠ØÙ‚يقي للإنتاجية على نطاق واسع.
لديك متطلبات توسع مستقلة ÙØ¹Ù„اً. إذا كان خط معالجة الصور لديك ÙŠØØªØ§Ø¬ إلى التوسع إلى مائة ØØ§Ù„Ø© أثناء ساعات العمل وخدمة الÙوترة ØªØØªØ§Ø¬ إلى اثنتين، ÙØ¥Ù† تشغيلها ÙÙŠ Ù†ÙØ³ العملية هو هدر. التوسع التلقائي على مستوى الخدمة ÙŠØÙ„ مشكلة ØÙ‚يقية هنا.
لديك منتج ناضج مع سياقات Ù…ØØ¯ÙˆØ¯Ø© ÙˆØ§Ø¶ØØ©. بعد عدة سنوات من التشغيل، ØªØµØ¨Ø Ø§Ù„ØØ¯ÙˆØ¯ الطبيعية ÙÙŠ مجالك — ØÙŠØ« نادراً ما ØªØØªØ§Ø¬ Ø¥ØØ¯Ù‰ أجزاء النظام إلى Ù…Ø¹Ø±ÙØ© Ø§Ù„ØØ§Ù„Ø© الداخلية لجزء آخر — ÙˆØ§Ø¶ØØ©. استخراج الخدمات على طول تلك Ø§Ù„ØØ¯ÙˆØ¯ØŒ عندما تÙهمها جيداً، أكثر أماناً بكثير من التخمين بشأنها ÙÙŠ اليوم الأول.
ØªØØªØ§Ø¬ إلى تعدد التقنيات. إذا كان منتجك الأساسي Node.js لكن خط معالجة البيانات لديك يخدمه Python بشكل Ø£ÙØ¶Ù„ ÙØ¹Ù„اً، وطبقة الاتصال الÙوري ØªØØªØ§Ø¬ Go للأداء، ÙØ¥Ù† الخدمات المصغرة ØªØªÙŠØ Ù„Ùƒ اتخاذ تلك القرارات لكل خدمة. هذا نادر ÙÙŠ الممارسة لدرجة أننا لن نستخدمه كمبرر أساسي.
المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© المعيارية: Ø£ÙØ¶Ù„ ما ÙÙŠ الاثنتين
المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© المعيارية هي النمط الذي نجد Ø£Ù†ÙØ³Ù†Ø§ نوصي به ÙÙŠ أغلب الأØÙŠØ§Ù†ØŒ وتستØÙ‚ قسمها الخاص لأنها كثيراً ما ÙŠÙØºÙÙ„ عنها ÙÙŠ الإطار الثنائي خدمات مصغرة مقابل معمارية Ø£ØØ§Ø¯ÙŠØ©.
الÙكرة ÙˆØ§Ø¶ØØ©: ابن٠معمارية Ø£ØØ§Ø¯ÙŠØ©ØŒ لكن Ø£Ù†ÙØ° ØØ¯ÙˆØ¯Ø§Ù‹ داخلية صارمة بين Ø§Ù„ÙˆØØ¯Ø§Øª. كل ÙˆØØ¯Ø© تملك نماذج بياناتها الخاصة ومنطق أعمالها الداخلي. تتواصل Ø§Ù„ÙˆØØ¯Ø§Øª من خلال واجهات Ù…ØØ¯Ø¯Ø© — لا بالوصول إلى جداول قاعدة بيانات أو دوال داخلية Ù„ÙˆØØ¯Ø© أخرى. ÙˆØØ¯Ø© الÙوترة لا تستورد نماذج ORM الخاصة Ø¨ÙˆØØ¯Ø© المصادقة. إذا Ø§ØØªØ§Ø¬Øª بيانات المستخدم، تستدعي واجهة عامة تعرضها ÙˆØØ¯Ø© المصادقة.
ÙÙŠ الممارسة هذا يعني استخدام هيكل مجلدات وقواعد استيراد تعكس ØØ¯ÙˆØ¯ الخدمة التي قد تريدها ÙÙŠ النهاية. ÙÙŠ تطبيق Node.js قد يعني هذا ØØ²Ù…اً Ù…Ù†ÙØµÙ„Ø© داخل monorepo. ÙÙŠ تطبيق Rails قد يعني Ù…ØØ±ÙƒØ§Øª Ù…Ù†ÙØµÙ„Ø© أو Ø§ØªÙØ§Ù‚يات تسمية ÙˆØ§Ø¶ØØ© Ù…ÙØ±ÙˆØ¶Ø© بقواعد linting.
النتيجة تطبيق ينشر ÙƒÙˆØØ¯Ø© ÙˆØ§ØØ¯Ø©ØŒ ÙˆÙŠÙØµØÙŽÙ‘Ø ÙƒÙˆØØ¯Ø© ÙˆØ§ØØ¯Ø©ØŒ ويشغّل قاعدة بيانات ÙˆØ§ØØ¯Ø© — لكنه منظم داخلياً بطريقة تجعل استخراج خدمة لاØÙ‚اً مشروعاً هندسياً Ù…ØØ¯Ø¯Ø§Ù‹ النطاق وليس إعادة كتابة كاملة. عندما تكون Ù„ÙˆØØ¯Ø© إدارة المستخدمين لديك واجهات Ù†Ø¸ÙŠÙØ© وترØÙŠÙ„اتها الخاصة، يعني استخراجها إلى خدمة Ù…Ù†ÙØµÙ„Ø© نقل ذلك الكود إلى نشر جديد، وليس ÙÙƒ تشابك سنوات من التبعيات المتقاطعة.
هذا ليس ØÙ„اً وسطاً. لمعظم منتجات SaaS ÙÙŠ معظم المراØÙ„ØŒ إنه الخيار الاستراتيجي الصØÙŠØ.
جدول المقارنة
| البعد | Ø£ØØ§Ø¯ÙŠØ© | Ø£ØØ§Ø¯ÙŠØ© معيارية | خدمات مصغرة |
|---|---|---|---|
| ØØ¬Ù… Ø§Ù„ÙØ±ÙŠÙ‚ المناسب | 1–10 مهندسين | 1–20 مهندساً | 10+ مهندسين لكل خدمة |
| تعقيد النشر | Ù…Ù†Ø®ÙØ¶ | Ù…Ù†Ø®ÙØ¶ | عال٠|
| سرعة التطوير (المرØÙ„Ø© المبكرة) | سريعة | سريعة | بطيئة |
| Ø§Ù„ØªÙƒÙ„ÙØ© التشغيلية | Ù…Ù†Ø®ÙØ¶Ø© | Ù…Ù†Ø®ÙØ¶Ø© | عالية |
| قابلية التوسع المستقل | لا | لا | نعم |
| قابلية التصØÙŠØ | سهلة | سهلة | صعبة |
| اتساق البيانات عبر الخدمات | بسيط (معاملات) | بسيط (معاملات) | صعب (sagas / اتساق تدريجي) |
| استخراج الخدمات مستقبلاً | ممكن، لكن Ù…ØÙو٠بالمخاطر | مباشر | غير مطبق |
استراتيجية قاعدة البيانات
كي٠تتعامل مع قاعدة بياناتك لا ÙŠÙ†ÙØµÙ„ عن قرارك المعماري، ومن المهم معالجته مباشرةً لأن الأخطاء هنا Ù…ÙƒÙ„ÙØ© التراجع عنها.
المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© ÙˆØ§Ù„Ø£ØØ§Ø¯ÙŠØ© المعيارية: قاعدة بيانات مشتركة
تستخدم كل من المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© ÙˆØ§Ù„Ø£ØØ§Ø¯ÙŠØ© المعيارية عادةً قاعدة بيانات علائقية مشتركة — Postgres أو MySQL أو ما شابه. هذه ميزة وليست قيداً. ضمانات المعاملات ACID عبر التطبيق بأكمله تجعل ضمانات الاتساق بسيطة. Ø§Ù„Ù…ÙØ§ØªÙŠØ الخارجية تعمل. الانضمامات تعمل. خطأ يعدّل جزئياً جدولين يمكن التراجع عنه بشكل ذري.
ÙÙŠ المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© المعيارية، ØØªÙ‰ وإن كانت Ø§Ù„ÙˆØØ¯Ø§Øª تشارك قاعدة البيانات، يجب أن تملك كل ÙˆØØ¯Ø© مجموعة جداولها الخاصة وتتجنب قراءة جداول Ø§Ù„ÙˆØØ¯Ø§Øª الأخرى مباشرةً. ÙŠØØ§Ùظ هذا على ØØ¯ÙˆØ¯ Ø§Ù„ÙˆØØ¯Ø© ØØªÙ‰ وإن كانت ÙˆØØ¯Ø© التخزين الأساسية مشتركة.
الخدمات المصغرة: قاعدة بيانات لكل خدمة
النمط المعتمد ÙÙŠ الخدمات المصغرة هو قاعدة بيانات لكل خدمة — كل خدمة تملك قاعدة بياناتها الخاصة ولا ÙŠÙØ³Ù…Ø Ù„Ø£ÙŠ خدمة أخرى بالاتصال بها. هذا ÙŠÙØ±Ø¶ ØØ¯ÙˆØ¯ الخدمة على مستوى البنية Ø§Ù„ØªØØªÙŠØ© ÙˆÙŠØªÙŠØ Ù„ÙƒÙ„ خدمة اختيار تقنية قاعدة بياناتها الخاصة.
Ø§Ù„ØªÙƒÙ„ÙØ© هي اتساق البيانات. نمط Saga هو الØÙ„ القياسي: تسلسل من المعاملات المØÙ„ية، يقوم كل منها بنشر ØØ¯Ø« ÙŠÙØ·Ù„Ù‚ الخطوة التالية. إذا ÙØ´Ù„ت خطوة، تÙÙ†Ùَّذ معاملات تعويضية للتراجع عن الخطوات السابقة. تطبيق sagas بشكل صØÙŠØ غير بسيط. اختبارها أصعب. تصØÙŠØ أخطائها عند ØØ¯ÙˆØ« خطأ ما يتطلب تتبعاً موزعاً جيداً وربطاً دقيقاً للسجلات.
توصيتنا Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ©
ابدأ بـ Postgres ونموذج بيانات جيد البناء. نظّم ترØÙŠÙ„اتك وتسمية جداولك ØØ³Ø¨ Ø§Ù„ÙˆØØ¯Ø© من اليوم الأول. يمكنك توسيع ØØ§Ù„Ø© Postgres ÙˆØ§ØØ¯Ø© أبعد مما Ø³ØªØØªØ§Ø¬ إليه معظم منتجات SaaS. عندما ØªØØªØ§Ø¬ ÙØ¹Ù„اً إلى استخراج خدمة، يكون ترØÙŠÙ„ البيانات مشروعاً Ù…ØØ¯Ø¯Ø§Ù‹ النطاق وليس طارئاً معمارياً.
ما نوصي به ÙÙŠ Cyberbeak
توصيتنا Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ© لمنتجات SaaS الجديدة هي المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© المعيارية — ونتمسك بهذا Ø§Ù„Ù…ÙˆÙ‚Ù Ø¨ØØ²Ù… ØØªÙ‰ يصل المنتج ÙˆØ§Ù„ÙØ±ÙŠÙ‚ إلى شروط تبرر ÙØ¹Ù„اً Ø§Ù„ØªÙƒÙ„ÙØ© التشغيلية للخدمات المصغرة.
ÙÙŠ الممارسة هذا يعني أننا نبني عادةً ÙÙŠ monorepo منظم جيداً، مع هيكل ÙˆØØ¯ÙˆÙŠØ© نطاق ÙˆØ§Ø¶Ø Ù…ÙØ±ÙˆØ¶ من اليوم الأول، ÙˆØØ¯ÙˆØ¯ API Ù†Ø¸ÙŠÙØ© بين Ø§Ù„ÙˆØØ¯Ø§ØªØŒ ÙˆØØ§Ù„Ø© Postgres ÙˆØ§ØØ¯Ø©. Ù†ÙØ¹Ùدّ CI/CD مناسباً، وتسجيلاً منظماً، ورصداً أساسياً من البداية — ليس لأننا نتوقع Ø§Ù„ØØ§Ø¬Ø© إلى تتبع موزع، بل لأن عادات الرصد الجيدة ذات قيمة بغض النظر عن المعمارية.
استخدمنا هذا النهج ÙÙŠ عدة مشاريع للعملاء كانت الغريزة الأولية Ùيها هي الذهاب لخدمات مصغرة كاملة. ÙÙŠ كل ØØ§Ù„ة، أطلق Ø§Ù„ÙØ±ÙŠÙ‚ MVP بشكل أسرع، وكرر على المنتج بسرعة أكبر، ولم ÙŠÙÙ†ÙÙ‚ — والأهم — ميزانيتهم المبكرة على إعداد Kubernetes وتصØÙŠØ شبكة الخدمات. اثنان من تلك المنتجات وصلا منذ ذلك الØÙŠÙ† إلى ØØ¬Ù… يجعل استخراج خدمات Ù…ØØ¯Ø¯Ø© منطقياً، ولأن ØØ¯ÙˆØ¯ Ø§Ù„ÙˆØØ¯Ø§Øª الداخلية كانت Ù†Ø¸ÙŠÙØ© من البداية، كانت تلك الاستخراجات مشاريع هندسية مخططة وليست أزمات.
Ù†ØÙ† نبني خدمات مصغرة. للعملاء الذين لديهم منتجات راسخة ÙˆÙØ±Ù‚ هندسية كبيرة أو متطلبات توسع ØÙ‚يقية على مستوى الخدمة، الخدمات المصغرة هي الجواب الصØÙŠØ بالتأكيد. لكننا لا نوصي بالبدء هناك، ÙˆÙ†Ø¯ÙØ¹ Ø¨ÙˆØ¶ÙˆØ Ø¹Ù†Ø¯Ù…Ø§ ÙŠÙØªØ±Ø¶ العملاء أن البدء بالخدمات المصغرة هو الخيار Ø§Ù„Ø·Ù…ÙˆØ Ø£Ùˆ الدقيق تقنياً.
Ø§Ù„Ø·Ù…ÙˆØ ÙÙŠ المعمارية يعني اختيار البنية التي ØªÙ…Ù†Ø Ù…Ù†ØªØ¬Ùƒ Ø£ÙØ¶Ù„ ÙØ±ØµØ© Ù„Ù„Ù†Ø¬Ø§Ø â€” وليس البنية التي تبدو الأكثر إبهاراً ÙÙŠ مخطط تصميم النظام.
الأسئلة الشائعة
هل يمكننا الانتقال من معمارية Ø£ØØ§Ø¯ÙŠØ© إلى خدمات مصغرة لاØÙ‚اً؟
نعم، وهذا هو المسار Ø§Ù„Ù…ÙØ¶Ù„ ÙØ¹Ù„اً للعديد من المنتجات Ø§Ù„Ù†Ø§Ø¬ØØ©. Ø§Ù„Ù…ÙØªØ§Ø هو بناء المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© Ø¨ØØ¯ÙˆØ¯ داخلية Ù†Ø¸ÙŠÙØ© ØØªÙ‰ يكون عمل الاستخراج Ù…ØØ¯Ø¯Ø§Ù‹ النطاق بوضوØ. بدأت Shopify ÙˆGitHub ÙˆStack Overflow جميعها كمعماريات Ø£ØØ§Ø¯ÙŠØ© واستخرجت الخدمات بشكل انتقائي مع نمو Ø§Ù„ØØ¬Ù… ÙˆØ§Ù„ÙØ±ÙŠÙ‚ مما جعله مجدياً ÙØ¹Ù„اً. مخاطر الانتظار Ù…Ù†Ø®ÙØ¶Ø© إذا بنيت المعمارية Ø§Ù„Ø£ØØ§Ø¯ÙŠØ© المعيارية بشكل صØÙŠØ.
ماذا عن الØÙˆØ³Ø¨Ø© بلا خادم؟ هل تغير Ø§Ù„ØØ³Ø§Ø¨Ø§ØªØŸ
دوال الØÙˆØ³Ø¨Ø© بلا خادم (AWS Lambda ÙˆVercel Edge Functions) تضي٠بعداً آخر لكنها لا تغير جوهر المقايضة الأساسية. يمكن أن ØªÙØ¯Ø®Ù„ الØÙˆØ³Ø¨Ø© بلا خادم Ù†ÙØ³ تعقيد الأنظمة الموزعة الخاصة بالخدمات المصغرة — البدايات الباردة، وقيود عديمة Ø§Ù„ØØ§Ù„ة، والتصØÙŠØ الموزع — دون الÙوائد التنظيمية الكاملة. نستخدم الØÙˆØ³Ø¨Ø© بلا خادم بانتقائية لأعباء عمل Ù…ØØ¯Ø¯Ø© (الوظائ٠الخلÙية، webhooksØŒ المهام المجدولة) إلى جانب تطبيق رئيسي وليس كبديل معماري شامل.
هل يؤثر هذا القرار بشكل كبير على ØªÙƒÙ„ÙØ© البنية Ø§Ù„ØªØØªÙŠØ©ØŸ
نعم. تشغيل معمارية Ø£ØØ§Ø¯ÙŠØ© Ù…ÙØ¬Ù‡ÙŽÙ‘زة جيداً على خادم ÙˆØ§ØØ¯ أو مجموعة صغيرة أرخص بشكل ملØÙˆØ¸ من تشغيل عشر خدمات مصغرة كل منها بموارد ØØ§ÙˆÙŠØ§Øª خاصة وموازنات تØÙ…يل وإعداد رصد. لمنتجات bootstrapped أو ÙÙŠ المرØÙ„Ø© المبكرة، يمكن أن يصل ÙØ§Ø±Ù‚ ØªÙƒÙ„ÙØ© البنية Ø§Ù„ØªØØªÙŠØ© إلى مئات أو آلا٠الدولارات شهرياً قبل أن تصل إلى ØØ¬Ù… تتجلى Ùيه Ùوائد الخدمات المصغرة.
كي٠أعر٠متى يكون منتجي جاهزاً للخدمات المصغرة؟
Ø§Ø·Ø±Ø Ø«Ù„Ø§Ø«Ø© أسئلة: هل لديك ÙØ±ÙŠÙ‚ كبير بما يكÙÙŠ بØÙŠØ« ÙŠÙقلل النشر المستقل بشكل ملØÙˆØ¸ من عبء التنسيق؟ هل لديك خدمة Ù…ØØ¯Ø¯Ø© بمتطلبات توسع Ù…Ø®ØªÙ„ÙØ© ÙØ¹Ù„اً عن بقية التطبيق؟ هل لديك سياقات Ù…ØØ¯ÙˆØ¯Ø© ÙˆØ§Ø¶ØØ© ومستقرة ÙÙŠ مجالك تم اختبارها مقابل الاستخدام Ø§Ù„ÙØ¹Ù„ي؟ إذا كانت الإجابة على الثلاثة نعم، ÙØ§Ù„خدمات المصغرة تستØÙ‚ التقييم. إذا كانت أي إجابة لا، ÙØ£Ù†Øª لم تصل إلى هناك بعد.
إذا كنت تبني منتج SaaS وتريد Ù…ØØ§Ø¯Ø«Ø© صادقة ØÙˆÙ„ المعمارية التي تمنØÙ‡ Ø£ÙØ¶Ù„ ÙØ±ØµØ© Ù„Ù„Ù†Ø¬Ø§Ø â€” وليس تلك التي تبدو الأكثر تطوراً — يسعدنا Ø§Ù„ØªØØ¯Ø«. نعمل مع ÙØ±Ù‚ ÙÙŠ كل مرØÙ„ة، من MVPs ما قبل البذرة إلى المنصات الراسخة ذات مشكلات التوسع الØÙ‚يقية، ونقدم Ù†ÙØ³ Ø§Ù„Ù†ØµÙŠØØ© المباشرة بغض النظر عن مكانك ÙÙŠ تلك الرØÙ„Ø©. تواصل معنا وسنخبرك بالضبط بما كنا سنبنيه ÙÙŠ وضعك.
تحدث مع فريقنا حول مشروعك
نعمل مع الشركات في المملكة المتحدة والولايات المتحدة والإمارات والمملكة العربية السعودية وكندا وأستراليا وألمانيا لبناء برامج مخصصة ومنصات SaaS وأنظمة السوق.