قائمة التحقق لهندسة البرمجيات الخلفية: دليلك لبناء منتج تقني من الصفر

دقائق القراءة: 15

مقدمة: لحظة الإلهام وبناء الأساس

قد تستيقظ ذات صباح، وبينما تحتسي قهوتك، تباغتك لحظة "يوريكا" العبقرية! لقد توصلت أخيرًا إلى نموذج عمل فريد لمشروعك، وبدأت جميع القطع تتجمع في مكانها. أنت متأكد من أن المستثمرين سيحبون الفكرة، ولا تطيق انتظار البدء في بناء المنتج. ميزة السبق في السوق تنتظرك. هذه اللحظات نادرة، ولكن عندما تحدث، يجب أن تنطلق في الوقت المناسب وبالتوجيه الصحيح.

ليس هذا هو الوقت المناسب للتجريب، بل هو وقت التنفيذ. إنه وقتك الآن! لكن كيف تضمن أنك تبني أساسًا متينًا لمنتجك التقني من البداية؟ يهدف هذا الدليل إلى تزويدك بقائمة تحقق شاملة لأهم الاعتبارات عند بناء بنية برمجية خلفية (Backend Architecture) لمنتجك من الصفر. لقد تعلمت هذه الدروس من خلال العمل على العديد من المنتجات في مراحلها المبكرة، وأدركت الحاجة الملحة لدليل يمنع الأخطاء الشائعة التي قد تكلفك الكثير لاحقًا.

ملاحظة هامة: يتعلق هذا الدليل ببناء معماريات البرمجيات من الصفر. إذا كنت مهتمًا بالتفاصيل الدقيقة للتقنيات المتضمنة، فتابع القراءة. وإلا، يرجى مشاركته مع من سيستفيد منه حتمًا.

اختيار اللغة وإطار العمل المناسبين لمشروعك

يُعد اختيار اللغة وإطار العمل الصحيحين لمنتجك مهمة معقدة، ولا يوجد حل سحري واحد يناسب الجميع. نصيحتي هي اختيار لغة تشعر بالراحة التامة عند استخدامها وتفهم تفاصيلها الدقيقة. ومع ذلك، هذا نادر، لأن قلة قليلة هم من "نينجا Javascript" أو "فهود Python"، أو أي تسميات أخرى. لذا، اختر لغة تتمتع بدعم قوي في الصناعة، مثل Javascript، Python، Java، أو Go على سبيل المثال.

تذكر أنك تبني منتجًا ذا حد أدنى من الميزات القابلة للتطبيق (MVP - Minimum Viable Product)، وستكون في طور إنشاء إثبات المفهوم (POC - Proof of Concept). لذا، أطلق منتجك في أقرب وقت ممكن. لا تقع في فخ المشكلات التي قد تنشأ من لغة جديدة تمامًا. لتجنب هذه المشكلات، اختر لغة أكثر استخدامًا وموثقة جيدًا. أخيرًا، يمكنك التوسع لاحقًا. إذا كنت في مرحلة إثبات المفهوم، فما عليك سوى البناء والإنجاز.

ولكن إذا كنت تبني شيئًا محددًا للغاية، وهناك لغة وإطار عمل مصممان خصيصًا لذلك، فعليك بالتأكيد اختيار تلك التقنية. ومع ذلك، في معظم الأحيان، يمكن معالجة المشكلات التي نحاول حلها بسهولة باستخدام أي من اللغات المذكورة أعلاه وأطر عملها. لذا، اختر واحدة وانطلق في بناء منتجك.

تطبيق خدمات المصادقة والتفويض المصغرة (Microservices)

هناك العديد من الطرق لمصادقة المستخدمين وتفويضهم. يمكنك تجربة Session Tokens، أو JWT (JSON Web Tokens)، أو OAuth، على سبيل المثال. كل خيار له إيجابياته وسلبياته الخاصة. دعنا نلقي نظرة فاحصة على بعضها.

رموز الويب JSON (JWT)

تُعد JWTs سريعة وسهلة التنفيذ. هذا لأن الرموز لا يتم تخزينها أبدًا في أي مكان على نظامك؛ يتم تشفيرها وتشفيرها وإرسالها إلى المستخدم. لذا، فإن التحقق من صحة JWT أسرع من أي طريقة أخرى. ولكن بما أنها لا تُخزن على النظام، لا يمكنك فعليًا جعل الرمز ينتهي قبل وقت انتهاء صلاحيته الفعلي، وقد يكون هذا مشكلة في حالات معينة. لذا، اكتشف إيجابيات وسلبيات كل نظام مصادقة واختر الأنسب لمتطلباتك. شخصيًا، أفضل JWTs (لكن هذا خياري الخاص).

التفويض (Authorization)

لا تنسَ أبدًا تطبيق تفويض المستخدمين. لا تريد أن يتمكن المستخدم 1 (User1) الذي سجل الدخول من تغيير تفاصيل المستخدم 2 (User2). هذا يمكن أن يسبب فوضى عارمة في نظامك. حدد نقاط النهاية (endpoints) التي تحتاج إلى تفويض، وقم بتطبيقها على الفور. لا تريد أن تتلف حالة قاعدة بياناتك بهذه الطريقة. تذكر الفرق بين رمز الخطأ 401 (غير مصرح به) و 403 (ممنوع).

فيما يلي بعض نقاط النهاية التي يجب عليك بالتأكيد مراعاتها عند إنشاء نظام المصادقة الخاص بك (لقد أنشأت واحدًا في Django باستخدام JWT). قد تكون هناك بعض الإضافات/الحذف لحالة استخدامك، ولكن هذه هي النقاط التي يجب أن تفكر في بنائها. توفر العديد من أطر العمل هذه الميزات جاهزة، ولكن ضعها في اعتبارك قبل بنائها بنفسك. تحقق من فئات المصادقة (_authentication classes) وفئات الأذونات (_permission classes) في إطار عمل Django Rest Framework لمزيد من المرجع.

مثال على بنية نظام مصادقة وتفويض المستخدمين

إنشاء نموذج أساسي مجرد (Abstract Base Model) لتوريثه لجميع النماذج الأخرى

هل تتذكر مبدأ "لا تكرر نفسك" (DRY Principle - Don't Repeat Yourself)؟ يجب اتباعه بصرامة في هندسة البرمجيات. بناءً على هذه الفكرة، ستكون هناك بعض الأعمدة في قاعدة بياناتك موجودة في كل جدول. لذلك، من الأفضل إنشاء فئة مجردة (abstract class) لها بحيث يمكن لفئات النماذج الأخرى (Model Classes) أن ترث منها.

مثال على نموذج أساسي مجرد في قاعدة البيانات

دعنا نراجع هذا الكود وما يعنيه:

  • id: على الرغم من أنه غير مكتوب هنا، إلا أنه يتم إنشاؤه تلقائيًا بواسطة إطار عمل Django. ولكن إذا لم يكن موجودًا في إطار عملك، فاكتبه في هذا الكلاس. إنه مجرد حقل يزيد تلقائيًا ويمكن استخدامه كمفتاح أساسي (Primary Key) في علاقة قاعدة بياناتك.
  • _created_at: يشير هذا إلى وقت إدراج الحقل/الصف في جدولك، ويتم ملؤه بواسطة إطار العمل نفسه. لا تحتاج إلى تعيينه بشكل صريح.
  • _updated_at: يشير هذا إلى وقت آخر تعديل/تحديث للحقل/الصف في جدولك، ومرة أخرى يتم ملؤه بواسطة إطار العمل نفسه.
  • _deleted_at + is_deleted: هذا حقل مثير للجدل. ليس لدي إجابة دقيقة عما إذا كان يجب أن يكون موجودًا أم لا، لأنه بصراحة، لا يتم حذف أي شيء على الإنترنت أبدًا. هذا الحقل، إذا تم ملؤه، يصور أن الصف قد تم حذفه من النظام (على الرغم من أن البيانات تظل في النظام للمراجع المستقبلية ويمكن إزالتها من قاعدة البيانات وتخزينها في النسخ الاحتياطية).
  • uuid: يعتمد الأمر على ما إذا كنت تريد وضع هذا في جدولك أم لا. إذا كنت بحاجة إلى كشف المفتاح الأساسي لجدولك لنظام خارجي، فمن الأفضل كشف هذا بدلاً من حقل العدد الصحيح الذي يزيد تلقائيًا. قد تتساءل لماذا… حسنًا، لماذا تريد إخبار نظام خارجي أن لديك 10378 طلبًا في جدولك؟ ولكن مرة أخرى، إنه اختيار شخصي.

إعداد خدمة الإشعارات المصغرة (Notification Microservice)

يحتاج كل منتج إلى إرسال تذكيرات وإشعارات للمستخدم لأغراض المشاركة والمعاملات. لذلك، سيحتاج كل منتج إلى هذا. يجب عليك بالتأكيد التفكير في بناء خدمة مصغرة (Microservice) توفر خدمات الإشعارات (مثل الإشعارات الفورية (Push Notification)، رسائل البريد الإلكتروني (Emails)، والرسائل النصية القصيرة (SMS)) للمستخدمين النهائيين. يجب أن تكون هذه خدمة مصغرة منفصلة تمامًا. لا تبنِها داخل خدمة المصادقة المصغرة (Authentication Microservice) أو خدمة التطبيق (Application Service) (منطق العمل الفعلي).

هناك العديد من المكتبات/الخدمات الخارجية التي يمكن استخدامها لبنائها لتطبيقك. استفد منها وقم بالبناء عليها. تذكر بناء جميع الوظائف الثلاث:

  • الإشعارات الفورية (Push Notifications): باستخدام APNS (لأجهزة iOS) و FCM (لأجهزة Android).
  • رسائل البريد الإلكتروني (Emails): ما عليك سوى دمج عميل SMTP للبدء.
  • الرسائل النصية القصيرة (SMS):

ملاحظة: خصص قناتين لإرسال الرسائل النصية القصيرة، واحدة للمعاملات (transactional) والأخرى للترويج (promotional). لا ترسل أبدًا رسالة ترويجية عبر قناة المعاملات، حيث توجد احتمالات بأن تتم مقاضاتك من قبل مستخدم مطلع وله دافع.

طريقة سهلة لتكوين عميل SMTP في تطبيقك هي استخدام هذا في إعداداتك:

مثال على إعدادات عميل SMTP في Django

لقد قمت بذلك في Django، ولكن يمكنك فعل الشيء نفسه في اللغة وإطار العمل الذي اخترته.

إعداد تسجيل الأخطاء (Error Logging)

استخدم وسيطًا (middleware) لتسجيل الأخطاء التي تحدث في نظام الإنتاج الخاص بك. لن تتم مراقبة نظام الإنتاج الخاص بك بواسطة بشر يجلسون هناك لمشاهدة سجلات التطبيق على مدار الساعة طوال أيام الأسبوع. لذلك، ستحتاج إلى نظام يسجل أخطاء الخادم الداخلية (Internal Server Errors) في مكان مركزي. بعد ذلك، يمكنك الذهاب والتحقق منها يوميًا أو إنشاء خطاف ويب (webhook) بحيث يمكنك تنبيهك في الوقت المناسب والتعامل معها.

هناك الكثير من أدوات تسجيل الأخطاء الخارجية في السوق. ما عليك سوى اختيار الأداة التي تناسب متطلباتك. أستخدم غالبًا Sentry أو Airbrake.

مثال على لوحة تحكم لتسجيل الأخطاء

فكر في تكوين خطافات الويب (webhooks)، كما ذكرت أعلاه. ستُعلم المستخدمين بالأخطاء، وعلى سبيل المثال، يمكنك نشر تلك الأخطاء فور حدوثها على قنوات Slack معينة. بعد ذلك، يمكنك التحقق من تلك القنوات بانتظام وتصحيحها بناءً على شدتها.

تطبيق تسجيل الطلبات والاستجابات وسجلات التطبيق

سيناريو: يأتي مستخدم إلى دعمك ويقول إنه لم يتلقَ إيصال المعاملة للمشتريات التي أجراها على موقعك. ماذا ستفعل؟ إذا كنت قد وضعت تسجيل التطبيق (Application Logging) في نظامك، فلا تقلق. ماذا أعني بذلك؟ من الأفضل دائمًا إظهار مثال بدلاً من محاولة الشرح بالكلمات. لذا، إليك هذا:

مثال على تسجيل إرسال بريد إلكتروني في سجلات التطبيق

لقد قمت بتسجيل أنني على وشك إرسال البريد الإلكتروني إلى معرف البريد الإلكتروني المذكور (email_id). يمكنني التحقق في سجلات التطبيق لمعرفة ما إذا كان البريد الإلكتروني قد تم إرساله بالفعل إلى العميل عن طريق التحقق مما إذا كان مثل هذا السجل موجودًا في النظام. تأكد من وضع سجلات شاملة في نظامك حتى تتمكن من تتبع مسار الطلب.

بالإضافة إلى ذلك، من الجيد وضع نظام غير متزامن (async system) يلتقط سجلات الطلبات والاستجابات وسجلات التطبيق هذه من نظامك ويقوم بتفريغها في مكان مركزي. هناك يمكن معالجتها لتكون أكثر سهولة في التفسير. تُعد حزمة ELK stack خيارًا جيدًا لذلك: ElasticSearchLogstashKibana.

ملاحظة: عند تسجيل الطلبات والاستجابات، انتبه لما يلي:

  • لا تسجل كلمات المرور (passwords).
  • لا تسجل الرموز (tokens) (رموز الوصول المستخدمة للمصادقة).
  • لا تسجل رموز التحقق لمرة واحدة (OTPs).

تطبيق التقييد (Throttling) على واجهات برمجة التطبيقات وتحديد المعدل (Rate Limiting) على خوادم التطبيق

سيناريو 1: لقد أطلقت للتو خدمتك وقمت بتسويق المنتج على منصات التواصل الاجتماعي. اكتشف أحد قراصنة القبعة السوداء ذلك، وأراد فقط اللعب بنظامك. لذلك خطط لهجوم حرمان من الخدمة (DOS - Denial of Service) على نظامك. لمكافحة ذلك، يمكنك تعيين تحديد المعدل (rate limiting) بناءً على عوامل مختلفة أعلى موازنات التحميل (load balancers) لخوادم التطبيق الخاصة بك. سيعالج هذا هجمات DOS ويمنع المستخدم الضار من مهاجمة خوادمك.

سيناريو 2: نقطة نهاية واجهة برمجة التطبيقات /otp/validate التي تتلقى رموز OTP مكونة من 4 أرقام لمصادقة المستخدم وتعيد رموزًا لاستخدامها في واجهات برمجة التطبيقات المصادق عليها. يحصل مستخدم ضار على رقم هاتف أحد عملائك، ويبدأ في ضرب نقطة نهاية واجهة برمجة التطبيقات بهجوم القوة الغاشمة (brute force attack) مع تغيير عناوين IP، وهو هجوم حرمان من الخدمة الموزع (DDOS - Distributed Denial of Service). لا يستطيع محدد المعدل إيقاف المستخدم، لأن عنوان IP يتغير مع كل طلب يتم تقديمه. لإيقاف هذا، يمكنك وضع تقييد (throttling) على واجهات برمجة التطبيقات بناءً على المستخدم أيضًا. يمكنك تكوين عدد الطلبات التي يمكن لمستخدم معين تقديمها إلى نقطة نهاية واجهة برمجة التطبيقات. للتحقق من OTP، عدد جيد هو 5 طلبات كل 10 دقائق. سيوقف هذا المستخدم الضار من تنفيذ هجوم DDOS بالقوة الغاشمة على واجهة برمجة التطبيقات المذكورة أعلاه.

تأسيس وتكوين الاتصال غير المتزامن (Asynchronous Communication) من اليوم الأول

سيناريو: تحتاج إلى إرسال بريد إلكتروني ترحيبي للمستخدم عند تسجيله في تطبيقك. يقوم عميل الواجهة الأمامية (front end client) بضرب واجهة برمجة التطبيقات للتسجيل (Register API)، وتقوم بإنشاء المستخدم في الواجهة الخلفية (backend) بعد التحقق من الصحة، ويبدأ هذا عملية إرسال بريد إلكتروني ترحيبي. سيستغرق إرسال هذا البريد الإلكتروني وقتًا، ربما بضع ثوانٍ. ولكن لماذا تريد أن يعلق عميل الهاتف المحمول بسبب مثل هذه العملية؟ يمكن أن يحدث هذا في الخلفية دون أن يعلق المستخدم دون سبب معين في صفحة التسجيل. كل ثانية ثمينة ولا تريد أن يفقد المستخدم تلك الثواني الثمينة. لذا، ما عليك سوى إرسال البريد الإلكتروني عبر مهمة غير متزامنة (Asynchronous task).

استخدم العمال (workers)، والمهام (tasks)، ووسطاء الرسائل (message brokers)، وخلفيات النتائج (result backends) لأداء هذا. مثال جيد على ذلك من عالم Python هو عامل Celery. ما عليك سوى وضع المهمة التي تحتاج إلى تنفيذها في وسيط رسائل (Rabbit MQ/SQS، وما إلى ذلك). سيستمع Celery إلى هذا وسيرسل المهمة إلى العامل المعين. سيقوم هذا العامل بعد ذلك بمعالجة الطلب ووضع النتيجة في خلفية نتائج يمكن أن تكون نظام تخزين مؤقت (Cache system)/نظام قاعدة بيانات (database system) (Redis/PostgreSQL على سبيل المثال). يمكنك مراقبة هذه المهام وقوائم الانتظار باستخدام العديد من المكتبات الخارجية. مثال جيد على ذلك هو Celery Flower الذي يراقب كل هذا.

مخطط يوضح تدفق الاتصال غير المتزامن باستخدام Celery و RabbitMQ

إعداد مهام Cron

سيناريو: لقد أطلقت للتو منتجك وتحتاج إلى إرسال توصيات لمستخدميك حول المنتجات الجديدة على منصتك. سترسل هذه التوصيات بناءً على سجل مشترياتهم كل عطلة نهاية أسبوع. يمكن تنفيذ المهمة المذكورة أعلاه بسهولة باستخدام مهمة cron. يمكن تكوينها بسهولة في كل إطار عمل. الشيء المهم الذي يجب مراعاته هو أنه لا يجب وضع مهام cron مباشرة في ملف crontab الخاص بخادمك. يجب أن تدع إطار العمل يتعامل معها. هذا لأن مهندس النشر (deployment engineer)/مهندس DevOps يجب أن يكون الشخص الوحيد الذي لديه حق الوصول إلى النظام بهذا الشكل لأسباب أمنية. على الرغم من أنك لست مضطرًا لتنفيذها بهذه الطريقة، إلا أنها ميزة جيدة يجب أن تكون موجودة من البداية. في عالم Django، يمكنك استخدام celerybeat لتكوين مهام cron الخاصة بك باستخدام عمال celery.

إدارة أسرارك بشكل صحيح (ملف المعلمات)

هناك العديد من الطرق لإدارة أسرار المعلمات في خوادم الإنتاج الخاصة بك. بعضها:

  • إنشاء ملف أسرار وتخزينه في سلة s3 خاصة، وسحبه أثناء نشر تطبيقك.
  • تعيين المعلمات في متغيرات البيئة (environment variables) أثناء نشر تطبيقك (تخزينها في s3 مرة أخرى).
  • وضع الأسرار في بعض خدمات إدارة الأسرار (مثل AWS Secrets Manager)، واستخدامها للحصول على الأسرار في تطبيقك.

يمكنك اختيار أي من هذه الطرق وفقًا لراحتك وحالة استخدامك. (يمكنك اختيار الاحتفاظ بملفات أسرار مختلفة لبيئات التطوير المحلية، والتدريجية (staging)، والإنتاج (production) أيضًا).

تحديد إصدارات واجهات برمجة التطبيقات (APIs) من اليوم الأول

هذا شيء يجب عليك بالتأكيد مراعاته من اليوم الأول. لن تعرف أبدًا مدى تكرار تغير نماذج عملك، وتحتاج إلى أن يكون لتطبيقك توافق أمامي وخلفي (forward-backward compatibility). لذا، يجب عليك تحديد إصدارات واجهات برمجة التطبيقات الخاصة بك لضمان أن كل شيء يعمل بسلاسة للجميع. يمكنك الحصول على تطبيقات مختلفة لإصدارات مختلفة ودع nginx يتعامل معها لتطبيقك. أو يمكنك الحصول على تحديد الإصدارات في التطبيق نفسه، ودع المسارات (routes) في خادم التطبيق الخاص بك تتعامل معها. يمكنك اختيار أي طريقة لتنفيذها – النقطة الرئيسية هي تمكين تحديد الإصدارات من البداية.

مثال على تحديد إصدارات واجهة برمجة التطبيقات

تحديد تحديثات الإصدارات الإجبارية والاختيارية لعملاء الواجهة الأمامية

ما الفرق بين التحديثات الإجبارية (hard updates) والتحديثات الاختيارية (soft updates

  • التحديثات الإجبارية: تشير إلى عندما يُجبر المستخدم على تحديث إصدار العميل إلى رقم إصدار أعلى مما هو مثبت على هاتفه المحمول.
  • التحديثات الاختيارية: تشير إلى عندما يُظهر للمستخدم إشعار بأن إصدارًا جديدًا متاحًا ويمكنه تحديث تطبيقه إلى الإصدار الجديد إذا رغب في ذلك.

التحديثات الإجبارية غير مشجعة، ولكن هناك أوقات تحتاج فيها إلى فرضها. مهما كانت الحالة، يجب عليك بالتأكيد التفكير في كيفية تنفيذ ذلك لتطبيقاتك. يمكنك القيام بذلك عن طريق تنفيذها أو تكوينها في Play Store أو App Store. طريقة أخرى هي إنشاء واجهة برمجة تطبيقات (API) في تطبيقك الخلفي (backend application) يتم الوصول إليها في كل مرة يتم فيها تشغيل تطبيق الهاتف المحمول. سترسل هذه الواجهة مفتاحين: hard_update -> true/false و soft_update -> true/false، اعتمادًا على إصدار المستخدم وإصدارات التحديثات الإجبارية والاختيارية المحددة في نظامك الخلفي. مكان جيد لتخزين هذه الإصدارات هو في ذاكرة التخزين المؤقت (cache) الخاصة بك (Redis/Memcache)، والتي يمكنك تغييرها بسرعة دون الحاجة إلى نشر تطبيقك.

إدخال التكامل المستمر (CI) من اليوم الأول

سيناريو: أحد المتدربين العاملين في مشروعك ليس كفؤًا بما يكفي لكتابة كود على مستوى الإنتاج. قد يكون قد غير شيئًا قد يعطل مكونًا حاسمًا في مشروعك. كيف يمكنك التأكد من أن كل شيء على ما يرام في مثل هذه الحالات؟

أدخل التكامل المستمر (Continuous Integration - CI). سيقوم بتشغيل أدوات فحص الكود (linters) وحالات الاختبار (test cases) على كل عملية التزام (commit)، وسيتوقف إذا تم انتهاك أي قواعد. سيؤدي هذا بدوره إلى منع طلبات السحب (pull requests) من الاندماج حتى تمر جميع قواعد فحص الكود وحالات الاختبار. إنها ميزة جيدة يجب أن تكون موجودة، وتساعد بالفعل على المدى الطويل أيضًا، لذا ضعها في اعتبارك. هناك الكثير من الخيارات المتاحة في السوق. يمكنك إما اختيار تنفيذ واحدة بنفسك (Jenkins CI/CD)، أو يمكنك استخدام TravisCI، CircleCI، وما إلى ذلك لنفس الغرض.

تمكين دعم Docker (تفضيل شخصي)

أنشئ ملف Dockerfile وملف docker-compose.yml لتطبيقك بحيث يقوم الجميع بتشغيل التطبيق باستخدام Docker من البداية. أحد الأسباب الرئيسية لاستخدام هذا النهج هو تحقيق الاتساق عبر بيئات التطوير المحلية والتدريجية والإنتاج، بحيث لا يمكن لأي مطور أن يقول مرة أخرى: "لكنه عمل على جهازي!".

ليس من الصعب توظيفه من اليوم الأول. في البداية، استخدم Docker فقط لبيئتك المحلية بحيث يكون إعداد تطبيقك سلسًا حقًا. ولكن ضع في اعتبارك كيف يمكنك تشغيله مع وبدون Docker في الإنتاج.

استخدام أداة مراقبة أداء التطبيق (APM)

تُعد أداة مراقبة أداء التطبيق (Application Performance Monitoring - APM) أمرًا ضروريًا إذا كنت ترغب في مراقبة واجهات برمجة التطبيقات (APIs) لتطبيقك، والمعاملات، واتصالات قاعدة البيانات، وما إلى ذلك.

سيناريو: القرص الصلب لخادم cron الخاص بك يكاد يكون ممتلئًا ولا يستطيع تشغيل مهام cron. نظرًا لأنه لا يمكنه العثور على مساحة على القرص، فإن مهام cron الخاصة بك لا تعمل. فكيف يمكنك الحصول على إشعار عندما يحدث هذا؟

هناك الكثير من أدوات APM التي يمكنك استخدامها لمراقبة هذا. يمكنك تكوينها وفقًا للوقت الذي تحتاج فيه إلى إشعار. ستتلقى إشعارات على الوسيط الذي تختاره عندما تحدث مثل هذه الفوضى في نظامك – وصدقني، يحدث هذا طوال الوقت. لذا، من الأفضل أن تكون مستعدًا لذلك. New Relic خيار جيد.

لوحة تحكم لأداة مراقبة أداء التطبيق (APM) مثل New Relic

استخدام ElasticSearch لتشغيل عمليات البحث على مستوى التطبيق في تطبيقات العميل

وفقًا لويكيبيديا، Elasticsearch هو محرك بحث يعتمد على مكتبة Lucene. يوفر محرك بحث نصي كامل موزع وقابل للتأجير المتعدد مع واجهة ويب HTTP ومستندات JSON خالية من المخططات. تم تطوير Elasticsearch بلغة Java.

في البداية، ستُغرى باستخدام استعلامات قاعدة البيانات التقليدية للحصول على نتائج في شريط البحث لتطبيق العميل. لماذا؟ لأنه سهل. لكن قواعد البيانات التقليدية ليست مصممة لمثل هذه الاستعلامات عالية الأداء. حدد وقتًا مناسبًا لترحيل بحثك إلى ElasticSearch وتقديم خط أنابيب للبيانات (data pipeline) إلى نظامك. يغذي هذا خط الأنابيب Elasticsearch بالبيانات ثم يربط البحث من ElasticSearch بخادم التطبيق.

وضع جدار حماية (Firewall) في خادم الإنتاج الخاص بك

يجب عليك بالتأكيد القيام بذلك – إنه أمر لا بد منه. ضع جدار حماية في خادم الإنتاج الخاص بك وأغلق جميع المنافذ باستثناء تلك التي ستُستخدم لواجهات برمجة التطبيقات (اتصالات https). قم بتوجيه نقاط نهاية واجهة برمجة التطبيقات باستخدام خادم ويب وكيل عكسي (reverse proxy web server)، مثل NGiNX أو Apache. لا ينبغي أن يكون أي منفذ متاحًا للعالم الخارجي بخلاف تلك المسموح بها بواسطة NGiNX.

الخلاصة التقنية

إن بناء منتج تقني ناجح من الصفر يتطلب أكثر من مجرد فكرة مبتكرة؛ إنه يتطلب بنية خلفية قوية ومدروسة جيدًا. تُمثل قائمة التحقق هذه خارطة طريق للمطورين والمهندسين لضمان تغطية الجوانب الأساسية التي غالبًا ما تُهمل في المراحل المبكرة. من اختيار التقنيات المناسبة إلى تطبيق آليات الأمان، والمراقبة، وقابلية التوسع، كل نقطة هنا تساهم في بناء نظام مرن وموثوق. إن الاستثمار في هذه الممارسات من اليوم الأول لا يوفر الوقت والجهد على المدى الطويل فحسب، بل يضع أيضًا أساسًا متينًا للنمو المستقبلي والابتكار، مما يجنب فرق التطوير الوقوع في فخ "الدين التقني" ويضمن تجربة مستخدم سلسة وآمنة.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *