بينما نواصل بيع لالأذواق الأكثر المميزين، ننتقل انتباهكم إلى موضوع آخر من بحثنا الإبداعي: انطلاقا الحدث-العمارة (EDA). ستجد أسفل المقطع مخططات انسيابية جميلة وقصة حول كيفية مساعدة هذا النموذج المبتكر في تطوير تطبيقات الويب.
تستكشف هذه المقالة بعض التحديات التي تدفع الابتكار في تطوير الويب الحديث. بعد ذلك ، سنغوص في الهندسة المبنية على الأحداث (EDA) لمعالجة هذه المشكلات من خلال إعادة تعريف بنية الخادم.
قطعت تطبيقات الويب شوطًا طويلاً منذ الأيام التي كان يتم فيها تقديم محتوى HTML الثابت من الخادم. اليوم ، أصبحت تطبيقات الويب أكثر تعقيدًا ، فهي تستخدم مجموعة متنوعة من الأطر ومراكز البيانات والتقنيات. في العامين الماضيين ، يمكن ملاحظة اتجاهين يحددان تطور سوق تكنولوجيا المعلومات:
- نقل التطبيقات إلى السحابة ؛
- تنفيذ بنية الخدمات المصغرة .
تحدد هذه الأفكار إلى حد كبير كيفية تصميم وبناء البرمجيات اليوم. يمكننا القول إننا اليوم لم نعد نبني تطبيقات ، بل منصات. لم تعد التطبيقات تشغل مساحة الحوسبة المشتركة. بدلاً من ذلك ، يتعين عليهم تبادل المعلومات مع بعضهم البعض باستخدام بروتوكولات اتصال خفيفة الوزن مثل REST APIs أو استدعاءات الإجراءات عن بُعد (RPC). أدى هذا النموذج إلى منتجات رائعة مثل Facebook و Netflix و Uber والمزيد.
تستكشف هذه المقالة بعض التحديات التي تدفع الابتكار في تطوير الويب الحديث. بعد ذلك ، سنغوص في الهندسة المبنية على الأحداث (EDA) لمعالجة هذه المشكلات من خلال إعادة تعريف بنية الخادم.
المشاكل الحالية للويب الحديث
يجب أن تتعامل أي تقنية ويب مع التحديات التي يجب أن تواجهها التطبيقات الحديثة غير المتزامنة متعددة المستخدمين ، والمصممة للعمل بسلاسة:
التوفر
الآن نحن لا نعمل مع تطبيق واحد ، ولكن مع العديد - العشرات أو حتى المئات - من الخدمات ذات الصلة ، ويجب على كل واحد منهم حل مشاكله على مدار الساعة ، سبعة أيام في الأسبوع. كيف احقق هذا؟ في أغلب الأحيان ، يتم تحجيم الخدمة أفقيًا إلى مثيلات متعددة يمكن توزيعها عبر مراكز بيانات متعددة لضمان الإتاحة العالية. يتم توجيه جميع الطلبات الخاصة بهذه الخدمة المعينة وتوزيعها بالتساوي عبر جميع المثيلات. توفر بعض أدوات النشر إمكانات الإصلاح الذاتي ، لذلك في حالة فشل مثيل ، يتم إنشاء مثيل آخر ليحل محله.
قابلية التوسع
قابلية التوسع في نواح كثيرة مشابهة للتوافر. يتمثل جوهر إمكانية الوصول في ضمان تشغيل مثيل واحد على الأقل من الخدمة وتشغيله ، وعلى استعداد لخدمة الطلبات الواردة. قابلية التوسع ، بدورها ، مرتبطة بشكل أساسي بالأداء. في حالة زيادة تحميل أحد التطبيقات ، يتم إنشاء طبعات جديدة لهذا التطبيق لاستيعاب العدد المتزايد من الطلبات. ولكن التوسع عموديا التطبيقات ليس بالأمر الهين، وخصوصا عندما يتعلق الأمر جليل التطبيقات .
مصدر واحد للحقيقة
قبل ظهور الخدمات المصغرة ، كانت هذه مهمة بسيطة إلى حد ما. كانت جميع البيانات موجودة في موقع واحد ، كقاعدة عامة ، كانت قاعدة بيانات ارتباطية واحدة أو أخرى. ومع ذلك ، عندما تشارك خدمات متعددة قاعدة بيانات ، يمكن إنشاء مشكلات مثل التبعيات بين الفرق المختلفة فيما يتعلق بتغييرات المخطط أو مشكلات الأداء. عادة يتم حل هذه المشكلة عن طريق تخصيص قاعدة بيانات خاصة بها لكل خدمة. يعد مصدر الحقيقة الموزع مفيدًا جدًا في الحفاظ على بنية نظيفة ، ولكن في مثل هذه الحالة ، يتعين عليك التعامل مع المعاملات الموزعة وتعقيد دعم قواعد البيانات المتعددة.
التزامن
في سيناريو نموذجي للاستجابة للطلب ، ينتظر العميل استجابة الخادم ؛ يقوم بحظر جميع الإجراءات حتى يتلقى ردًا ، أو حتى انتهاء التأخير المحدد. إذا اتخذت هذا السلوك وقمت بتطبيقه في بنية الخدمات المصغرة باستخدام سلاسل المكالمات التي تعمل عبر النظام بأكمله ، فيمكن أن ينتهي بك الأمر بسهولة إلى ما يسمى "جحيم الخدمات المصغرة". كل شيء يبدأ بالاتصال بخدمة واحدة فقط ، دعنا نسميها "الخدمة أ". ولكن بعد ذلك ، يتعين على الخدمة A الاتصال بالخدمة B ، وتبدأ المتعة. المشكلة في هذا السلوك هي: إذا كانت الخدمة نفسها مرتبطة بالموارد المحظورة (على سبيل المثال ، تعليق مؤشر ترابط) ، فإن التأخيرات تنمو بشكل كبير. إذا سمحنا بتأخير قدره 500 مللي ثانية لكل خدمة ، وكانت هناك خمس مكالمات خدمة في السلسلة ، فستحتاج الخدمة الأولى إلى تأخير 2500 مللي ثانية (2.5 ثانية) ، والأخيرة - 500 مللي ثانية.
تحديات الويب الحديث
مقدمة في العمارة المبنية على الأحداث
الهندسة المبنية على الأحداث (EDA) هي نموذج معماري للبرامج يسهل توليد الأحداث واكتشافها واستهلاكها والاستجابة لها.
في التطبيقات ثلاثية المستويات الكلاسيكية ، يكون جوهر النظام هو قاعدة البيانات. في أكاديمية الإمارات الدبلوماسية ، ينتقل التركيز إلى الأحداث وكيفية تدفقها عبر النظام. يسمح لنا هذا التحول في التركيز بتغيير طريقة تصميم التطبيقات تمامًا وحل المشكلات المذكورة أعلاه.
قبل أن ننظر إلى كيفية القيام بذلك بالضبط في أكاديمية الإمارات الدبلوماسية ، دعونا ننظر إلى ماهية "الحدث". الحدث هو إجراء يبدأ إما ببعض الإشعارات أو تغيير في حالة التطبيق. تم تشغيل الضوء (إخطار) ، أوقف منظم الحرارة نظام التدفئة (إشعار) ، قام المستخدم بتغيير عنوانه (تغيير الحالة) ، قام أحد أصدقائك بتغيير رقم هاتفه (تغيير الحالة). هذه كلها أحداث ، ولكن ليس بعد حقيقة أننا يجب أن نضيفها إلى حل يحركه الحدث. من المفترض أن تتم إضافة الأحداث المتعلقة بالأعمال فقط إلى الهيكل. يعتبر حدث "طلب المستخدم" أمرًا مهمًا من وجهة نظر العمل ، ولكن "يأكل المستخدم البيتزا المطلوبة أو الغداء" ليس كذلك.
إذا فكرت في بعض الأحداث ، فمن الواضح على الفور فيما يتعلق ببعض الأحداث أنها مهمة للأعمال ، والبعض الآخر - لا. خاصة فيما يتعلق بتلك التي تحدث استجابة لأحداث أخرى. يتم استخدام تقنية تسمى " هجوم الحدث " لتحديد الأحداث التي تمر عبر النظام . يتم دعوة المشاركين في تطوير التطبيقات (من المبرمجين إلى مطوري منطق الأعمال والخبراء المتخصصين) إلى الاجتماع ووضع خريطة مشتركة لجميع العمليات التجارية ، وتقديمها في شكل أحداث محددة. عندما تكون هذه الخريطة جاهزة ، تتم صياغة نتيجة العمل في شكل متطلبات يجب الوفاء بها عند تطوير التطبيقات.
مثال على تطبيق الحجز الموصوف بواسطة طريقة الاعتداء على الحدث
بعد تحديد الأحداث التي تهمنا وبعد أن قررنا كيفية تحديدها ، دعنا نلقي نظرة على كيف يمكن لهذا النموذج أن يحل المشكلات النموذجية المذكورة أعلاه.
تدفق الأحداث أحادي الاتجاه: من المنتج إلى المستهلك. قارن هذا الموقف باستدعاء REST. لا يتوقع منتج الحدث من حيث المبدأ ردًا من المستهلك ، بينما في حالة مكالمة REST ، سيكون هناك دائمًا استجابة. لا توجد استجابة تعني عدم الحاجة إلى منع تنفيذ التعليمات البرمجية حتى يحدث شيء آخر. في هذه الحالة ، تصبح الأحداث غير متزامنة بطبيعتها ، مما يقضي تمامًا على خطر التعثر في التأخيرات.
تحدث الأحداث نتيجة إجراء ، لذلك لا يوجد نظام مستهدف ؛ لا يمكن القول بأن الخدمة "أ" تطلق أحداثًا في الخدمة "ب" ؛ ولكن يمكننا القول أن الخدمة "ب" مهتمة بالأحداث الناتجة عن الخدمة "أ". صحيح ، قد يكون هناك "أطراف أخرى معنية" في هذا النظام ، على سبيل المثال ، الخدمات ج أو د.
كيف يمكننا التأكد من أن حدثًا بدأ في نظام معين يصل إلى الجميع الخدمات "المهتمة"؟ عادة ، يتم حل هذه الأنظمة باستخدام وسطاء الرسائل. الوسيط هو ببساطة تطبيق يعمل كوسيط بين مرسل الحدث (التطبيق الذي أنشأ الحدث) ومستهلك الحدث. وبالتالي ، يمكن فصل التطبيقات بدقة عن بعضها ، مع الاهتمام بقضية إمكانية الوصول، والتي تمت مناقشتها أعلاه في هذا المنشور. إذا لم يكن التطبيق متاحًا في الوقت الحالي ، فعند العودة عبر الإنترنت ، سيبدأ في استهلاك الأحداث ومعالجتها ، وتعويض كل تلك الأحداث التي حدثت خلال الفترة التي لم تكن متاحة فيها.
ماذا عن مستودع البيانات؟ هل يمكن تخزين الأحداث في قاعدة بيانات ، أم أن هناك حاجة إلى شيء آخر بدلاً من قاعدة البيانات؟ بالتأكيد ، يمكن تخزين الأحداث في قواعد البيانات ، ولكن في هذه الحالة يضيع جوهر "الحدث". بمجرد وقوع الحدث ، لا يمكننا تصحيحه ، وبالتالي فإن الأحداث بطبيعتها غير قابلة للتغيير. قواعد البيانات ، بدورها ... قابلة للتغيير ، بعد إدخال البيانات في قاعدة البيانات ، يمكن تغييرها.
من الأفضل تخزين الأحداث في سجلات الأحداث . سجلات الأحداث ليست أكثر من مركزيةمستودع البيانات ، حيث يتم تسجيل كل حدث كسلسلة من السجلات غير القابلة للتغيير ، ما يسمى بـ "السجل". يمكن مقارنة السجل بالسجل ، حيث يتم إضافة كل حدث جديد إلى نهاية القائمة. يمكنك دائمًا إعادة إنشاء أحدث حالة عن طريق إعادة تشغيل جميع أحداث السجل من البداية إلى الوقت الحاضر.
لذلك ، قمنا بتغطية جميع المشكلات باستثناء قابلية التوسع. تم تصميم الخدمات المستندة إلى الأحداث دائمًا ليتم نشرها عبر مثيلات متعددة. نظرًا لأنه يتم تخزين الحالة على هذا النحو في سجل الأحداث ، ستكون الخدمة نفسها بدون حالة ، مما يسمح بتحجيم دقيق جراحيًا لأي خدمة ذات أهمية.
الاستثناء الوحيد لهذا المبدأ هو الخدمات المصممة لخلق آراء واقعية.... في جوهرها ، وجهة النظر المادية هي حالة تصف سجل الأحداث في نقطة زمنية محددة. يتم استخدام هذا الأسلوب لتسهيل الاستعلام عن البيانات. وبالعودة إلى مسألة القياس ، فإن الرؤية المجسدة هي ببساطة نظرة مجمعة للأحداث التي تشبه الجدول ؛ لكن أين نخزن هذه الطاولات؟ في أغلب الأحيان ، ترى مثل هذه التجمعات في الذاكرة ، وفي نفس الوقت تتحول خدمتنا تلقائيًا إلى خدمة ذات حالة. الحل السريع والسهل هو توفير قاعدة بيانات محلية لكل خدمة تخلق طرق عرض حقيقية. بهذه الطريقة يتم تخزين الحالة في قاعدة البيانات وتشغيل الخدمة بدون حالة.
على الرغم من أن الهندسة المعمارية القائمة على الأحداث كانت موجودة منذ أكثر من 15 عامًا ، إلا أنها اكتسبت مؤخرًا شعبية كبيرة ، وهذا ليس من قبيل الصدفة. تمر معظم الشركات بمرحلة من " التحول الرقمي " بمطالب جامحة. بسبب تعقيد هذه المتطلبات ، يتعين على المهندسين إتقان أساليب جديدة لتصميم البرامج ، مما يعني ، على وجه الخصوص ، إضعاف تماسك الخدمات مع بعضها البعض وتقليل تكلفة صيانة الخدمات. EDA هو أحد الحلول الممكنة لهذه المشاكل ، ولكن ليس الحل الوحيد. أيضًا ، لا تتوقع حل جميع المشكلات ، ما عليك سوى التبديل إلى EDA. قد لا تزال بعض الميزات تتطلب واجهات برمجة تطبيقات REST قوية وقديمة الطراز أو تخزين قاعدة بيانات. اختر أفضل ما يناسبك وصممه بشكل صحيح!