كيفية إنشاء منصة متعددة التطبيقات من قاعدة واحدة
5 دقيقة قراءةMohammad Shaker

كيفية إنشاء منصة متعددة التطبيقات من قاعدة واحدة

تعتمد Alphazed على قاعدة خلفية مشتركة وبنية Flutter موحدة لتشغيل أكثر من 7 تطبيقات تعليمية بكفاءة واستقرار.

Engineering

إجابة سريعة

تعتمد Alphazed على قاعدة خلفية مشتركة وبنية Flutter موحدة لتشغيل أكثر من 7 تطبيقات تعليمية بكفاءة واستقرار.

تدير Alphazed أكثر من 7 تطبيقات تعليمية (Amal، Thurayya، Qais، KidElite، Alphazed School، Alphazed Montessori، وأكثر) من قاعدة شفرة خلفية واحدة وإطار عمل Flutter المحمول المشترك. يحصل كل تطبيق على جداول قاعدة البيانات الخاصة به (مسبوقة)، الإعدادات، إشعارات الدفع، قوالب البريد الإلكتروني، والمحتوى — ولكن يشارك في المصادقة (AWS Cognito)، بنية التحليلات، والخوارزميات التعليمية الأساسية.

الخلفية: اختيار التطبيق عند التشغيل

كيف يعمل

عند النشر، تختار متغير البيئة التطبيق:

# نشر Amal
export APP_NAME=amal
serverless deploy

نشر Thurayya

export APP_NAME=thurayya serverless deploy

نشر Qais

export APP_NAME=qais serverless deploy

ينشئ كل نشر وظائف Lambda مستقلة، طرق API Gateway، والمراقبة — ولكنها جميعًا تربط بقاعدة الشفرة الخلفية نفسها.

أولوية إعداد من ثلاثة مستويات

# src/config.py
import os

app_name = os.getenv('APP_NAME', 'amal')

المستوى 1: مطابقة تطبيق دقيقة

config = load_json(f'config/{app_name}.json')

المستوى 2: مطابقة عائلة التطبيق (إذا لم يكن هناك إعداد دقيق)

if not config: family = app_name.split('_')[0] # 'amal_beta' → 'amal' config = load_json(f'config/{family}.json')

المستوى 3: الافتراضي

if not config: config = load_json('config/default.json')

إعداد لكل تطبيق (config/amal.json)

{
  "app_name": "amal",
  "app_id": "com.alphazed.amal",
  "database": {
    "table_prefix": "amal_"
  },
  "email": {
    "template_dir": "templates/amal",
    "from_address": "amal@alphazed.com",
    "from_name": "Amal Team"
  },
  "push_notifications": {
    "firebase_project": "alphazed-amal",
    "apns_certificate": "certs/amal.pem"
  },
  "content": {
    "s3_bucket": "amal-content-production",
    "curriculum_id": "amal_v3_arabic"
  },
  "feature_flags": {
    "enable_tajweed_feedback": false,
    "enable_noorani_qaida": false,
    "enable_juz_amma": false,
    "enable_creature_building": true,
    "enable_physics_games": true
  },
  "pricing": {
    "monthly_usd": 6.99,
    "yearly_usd": 67.99,
    "trial_days": 14
  }
}

الموارد المشتركة مقابل الموارد الخاصة بالتطبيق

المورد مشترك خاص بالتطبيق السبب
شفرة Lambda ✓ نعم ✗ لا قاعدة شفرة واحدة، التفريع بواسطة APP_NAME
مثيل RDS ✓ نعم ✗ لا (جداول مسبوقة) تخفيض التكاليف، نسخة احتياطية واحدة
محتوى S3 ✗ لا ✓ نعم كل تطبيق لديه منهجه الخاص
AWS Cognito ✓ نعم ✗ لا (عبر app_id) مصادقة مركزية، التمييز بواسطة app_id
بحيرة التحليلات ✓ نعم ✗ لا (مقسمة بالتطبيق) أنبوب موحد، بيانات منفصلة
رسائل Firebase ✗ لا ✓ نعم APNs + FCM خاصة بالتطبيق

الواجهة الأمامية: بنية تطبيقات متعددة لـ Flutter

النواة المشتركة (packages/alphazed_common)

  • إدارة الحالة (Riverpod)
  • التعامل مع الصوت
  • مكتبة الرسوم المتحركة (تكامل Rive)
  • نظام التصميم (الألوان، النصوص، الواجهات)
  • تدفقات المصادقة
  • عميل التحليلات

طبقات خاصة بالتطبيق (apps/amal، apps/thurayya، إلخ)

apps/
  ├── amal/
  │   ├── lib/
  │   │   ├── main.dart (نقطة دخول التطبيق)
  │   │   ├── config/
  │   │   │   ├── curriculum.json (بنية دروس Amal)
  │   │   │   ├── colors.dart (موضوع Amal)
  │   │   │   └── characters.json (تخصيص الأفاتار)
  │   │   └── screens/ (شاشات خاصة بـ Amal)
  │   └── pubspec.yaml (اعتماديات Amal)
  │
  ├── thurayya/
  │   ├── lib/
  │   │   ├── main.dart (نقطة دخول مختلفة)
  │   │   ├── config/
  │   │   │   ├── curriculum.json (بنية جزء عم)
  │   │   │   ├── colors.dart (موضوع Thurayya)
  │   │   │   └── characters.json (تخصيص الأفاتار)
  │   │   └── screens/ (شاشات خاصة بـ Thurayya)
  │   └── pubspec.yaml (اعتماديات Thurayya)
  │
  └── packages/
      └── alphazed_common/ (شفرة مشتركة)

الإعداد في وقت الإنشاء

# بناء Amal
flutter build apk --dart-define=APP_NAME=amal --dart-define=CURRICULUM=amal_v3

بناء Thurayya

flutter build apk --dart-define=APP_NAME=thurayya --dart-define=CURRICULUM=thurayya_juzamma

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

النشر: مجموعات مستقلة

إعداد إطار العمل بدون خادم

# serverless.yml
service: alphazed-backend

custom: pythonRequirements: dockerizePip: true app_name: ${env:APP_NAME}

functions:

يتم نشر هذه الوظائف لكل قيمة APP_NAME

get_user: handler: src/handlers/user.get_user events: - http: path: app/{app_name}/user/{user_id} method: get

content_duo: handler: src/handlers/content.generate_content_duo timeout: 20 events: - http: path: app/{app_name}/content_duo method: post

resources: Resources: # يحصل كل تطبيق على مجموعة سجلات CloudWatch الخاصة به ${self:custom.app_name}LogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: /aws/lambda/alphazed-${self:custom.app_name} RetentionInDays: 30

عند النشر مع APP_NAME=amal، ينشئ CloudFormation:

  • وظائف Lambda مسبوقة بـalphazed-amal-*
  • طرق API Gateway تحت /amal/*
  • سجلات CloudWatch تحت /aws/lambda/alphazed-amal
  • توسع ومراقبة مستقلة

لماذا هذا مهم

لفرق المنتجات

  • إطلاق تطبيق جديد: أسابيع بدلًا من شهور (مشاركة البنية التحتية)
  • تحقيق التكافؤ في الميزات: تطبيق إصلاح الأخطاء وتحسين الخوارزميات على جميع التطبيقات فورًا
  • اختبار A/B: تجربة الميزات بسهولة على تطبيق واحد قبل التوسع إلى الآخرين

للهندسة

  • قاعدة شفرة واحدة: مجموعة اختبارات واحدة، خط واحد للدمج والنشر المستمر (CI/CD)
  • الخوارزميات التعليمية المشتركة: التكرار المتباعد وخلط المحتوى يفيد جميع التطبيقات
  • كفاءة التشغيل: فريق واحد يدير كل البنية التحتية

للتكلفة

  • RDS مشتركة: جزء من تكلفة 7 قواعد بيانات مستقلة
  • Cognito مشتركة: موفر هوية واحد لجميع التطبيقات
  • التحليلات المشتركة: أنبوب واحد يخدم 7 تطبيقات
  • تقدير توفير التكاليف: 40,000 - 60,000 دولار/سنة مقارنة بالخلفيات المستقلة

التحديات والحلول

التحدي 1: تعارض في مخطط قاعدة البيانات

  • Amal يحتاج إلى جدول amal_user_memory
  • Thurayya يحتاج إلى جدول thurayya_user_memory (حقول مختلفة لحفظ القرآن)
  • الحل: الترحيل مدرك للتطبيق. ملف migrations/001_amal_user_memory.sql يعمل فقط عندما APP_NAME=amal

التحدي 2: مجموعات ميزات مختلفة

  • Thurayya لديه ملاحظات التجويد؛ Amal لا يحتوي عليها
  • Amal لديه ألعاب الفيزياء؛ Thurayya لا يحتوي عليها
  • الحل: أعلام الميزات في الإعدادات (enable_tajweed_feedback، enable_physics_games)

التحدي 3: التوسع المستقل

  • Amal يشهد زيادة في الزيارات؛ Thurayya في هدوء
  • مشترك Lambda pool يعني التنافس على الإنتاجية المتزامنة
  • الحل: سياسات توسيع CloudWatch لكل تطبيق. إذا وصلت Lambdas الخاصة بـamal-* إلى الحد المحدد، يتم التوسع تلقائيًا بشكل مستقل

الأسئلة الشائعة

س: ألا يؤدي مشاركة قاعدة شفرة واحدة إلى إنشاء ترابط بين التطبيقات؟
ج: لا. شفرة كل تطبيق موجودة في أدلة منفصلة (apps/amal، apps/thurayya). الشفرة المشتركة في packages/alphazed_common وتتم مراجعتها بشكل صريح. الترابط الوثيق يعد علامة تصميم غير حسنة — نكتشفه في مراجعة الشفرة.

س: ماذا لو كان أحد التطبيقات يحتاج إلى تغيير API كبير؟
ج: نحن ننشر واجهات برمجة التطبيقات (API) لكل تطبيق: /amal/v1/*، /thurayya/v1/*. يمكن للتطبيقات التحديث بشكل مستقل. الإصدارات القديمة تعمل لمدة تصل إلى 12 شهرًا، مما يمنح فرق التطبيقات الوقت لتحديثها.

س: هل يمكن للتطبيقات مشاركة المستخدمين؟
ج: ليس افتراضيًا. كل تطبيق لديه جدول مستخدم خاص به (مسبوق). إذا أراد الوالد الاشتراك في كل من Amal وThurayya، يقوم بإنشاء حسابات منفصلة (أو يمكننا إضافة ميزة "ربط العائلة" لاحقًا).

مقالات ذات صلة