Si Ndërtuam një Platformë Multi-Aplikacion nga Një Bazë Kodi
Lexim: 6 minMohammad Shaker

Si Ndërtuam një Platformë Multi-Aplikacion nga Një Bazë Kodi

Alphazed menaxhon 7+ aplikacione edukative me një bazë kodi të përbashkët dhe framework Flutter për celularë.

Engineering

Përgjigje e shpejtë

Alphazed menaxhon 7+ aplikacione edukative me një bazë kodi të përbashkët dhe framework Flutter për celularë.

Alphazed menaxhon 7+ aplikacione edukative (Amal, Thurayya, Qais, KidElite, Alphazed School, Alphazed Montessori, dhe të tjera) nga një bazë e vetme kodi në backend dhe një framework i përbashkët Flutter për celularë. Çdo aplikacion ka tabela të veta në bazën e të dhënave (me parapronë), konfigurim, njoftime push, template e-mail, dhe përmbajtje — por ndan autentifikimin (AWS Cognito), infrastrukturën e analizave, dhe algoritmet kryesore të mësimit.

Backend: Zgjedhja e Aplikacionit në Kohë Ekzekutimi

Si Funksionon

Gjatë vendosjes (deployment), një variabël mjedisi përzgjedh aplikacionin:

# Deploy Amal
export APP_NAME=amal
serverless deploy

Deploy Thurayya

export APP_NAME=thurayya serverless deploy

Deploy Qais

export APP_NAME=qais serverless deploy

Çdo vendosje krijon funksione Lambda të pavarura, rrugë API Gateway, dhe monitorim — por të gjitha lidhen me të njëjtën bazë kodi në backend.

Prioriteti i Konfigurimit në Tre Nivela

# src/config.py
import os

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

Niveli 1: Përputhje e saktë me aplikacionin

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

Niveli 2: Përputhja familjare e aplikacionit (nëse konfigurimi i saktë nuk ekziston)

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

Niveli 3: Parazgjedhja

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

Konfigurimi për Çdo Aplikacion (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
  }
}

Burimet e Përshtatura dhe të Përbashkëta

BurimiPërbashkëtPër AplikacionArsyeja
Kodi Lambda✓ Po✗ JoBazë kodi e vetme, degëzim sipas APP_NAME
Instanca RDS✓ Po✗ Jo (tabela me parapronë)Ulje kostoje, backup i vetëm
Përmbajtja S3✗ Jo✓ PoÇdo aplikacion ka mësimin e vet
AWS Cognito✓ Po✗ Jo (përmes app_id)Autentifikim qendror, app_id ndan aplikacionet
Analytics lake✓ Po✗ Jo (ndarë sipas aplikacionit)Pipeline i unifikuar, të dhëna të ndara
Mesazhet Firebase✗ Jo✓ PoAPNs + FCM specifik për aplikacionin

Frontend: Arkitektura Multi-Aplikacion Flutter

Baza e Përbashkët (packages/alphazed_common)

  • Menaxhimi i shtetit (Riverpod)
  • Trajtimi i audios
  • Libraria e animacioneve (integrimi i Rive)
  • Sistemi i dizajnit (ngjyrat, tipografia, widget-et)
  • Proceset e autentifikimit
  • Klienti i analizave

Shtresat specifike për aplikacion (apps/amal, apps/thurayya, etj.)

apps/
  ├── amal/
  │   ├── lib/
  │   │   ├── main.dart (pikë hyrje aplikacioni)
  │   │   ├── config/
  │   │   │   ├── curriculum.json (struktura e mësimit të Amal)
  │   │   │   ├── colors.dart (tema e Amal)
  │   │   │   └── characters.json (personalizimi i avatarit)
  │   │   └── screens/ (ekranet specifike të Amal)
  │   └── pubspec.yaml (varësitë e Amal)
  │
  ├── thurayya/
  │   ├── lib/
  │   │   ├── main.dart (pikë hyrje ndryshme)
  │   │   ├── config/
  │   │   │   ├── curriculum.json (struktura Juz Amma)
  │   │   │   ├── colors.dart (tema e Thurayya)
  │   │   │   └── characters.json (personalizimi i avatarit)
  │   │   └── screens/ (ekranet specifike të Thurayya)
  │   └── pubspec.yaml (varësitë e Thurayya)
  │
  └── packages/
      └── alphazed_common/ (kodi i përbashkët)

Konfigurimi në Kohë Ndërtimi

# Build Amal
flutter build apk --dart-define=APP_NAME=amal --dart-define=CURRICULUM=amal_v3

Build Thurayya

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

Në kohë ndërtimi, secili aplikacion merr të dhënat e mësimit, ngjyrat, dhe konfigurimin e vet të integruar. Repo kodi i vetëm, shumë binarë të përpiluar.

Vendosja: Staket e Pavarura

Konfigurimi Serverless Framework

# serverless.yml
service: alphazed-backend

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

functions:

Këto funksione implementohen për çdo vlerë 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: # Çdo aplikacion ka grupin e vet CloudWatch log ${self:custom.app_name}LogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: /aws/lambda/alphazed-${self:custom.app_name} RetentionInDays: 30

Kur vendosni me APP_NAME=amal, CloudFormation krijon:

  • Funksione Lambda me parapronë alphazed-amal-*
  • Rrugë API Gateway nën /amal/*
  • Logje CloudWatch nën /aws/lambda/alphazed-amal
  • Shkallëzim dhe monitorim të pavarur

Pse Ka Rëndësi

Për Ekipet e Produktit

  • Lançim i aplikacioneve të reja: javë në vend të muajsh (infrastrukturë e përbashkët)
  • Barazi në funksionalitet: shënime gabimesh dhe përmirësime algoritmesh për të gjitha aplikacionet menjëherë
  • Testime A/B: testoni lehtë funksione në një aplikacion para se t'i shpërndani në të tjerët

Për Inxhinierinë

  • Bazë kodi një-fishe: një grup testimesh, një pipeline CI/CD
  • Algoritme të përbashkëta të mësimit: përsëritja në intervale dhe përzierja e përmbajtjes ndihmojnë të gjitha aplikacionet
  • Efiçiencë operacionale: një ekip menaxhon gjithë infrastrukturën

Për Koston

  • RDS i përbashkët: një pjesë e kostos së 7 bazave të dhënash të pavarura
  • Cognito i përbashkët: një ofrues autentifikimi për të gjitha aplikacionet
  • Analizat e përbashkëta: një pipeline për 7 aplikacione
  • Shpenzime të kursyera të llogaritura: 40,000-60,000 dollarë në vit krahasuar me backende të ndara

Sfidat dhe Zgjidhjet

Sfida 1: Konflikte në skemën e bazës së të dhënave

  • Amal ka nevojë për tabelën amal_user_memory
  • Thurayya ka tabelën thurayya_user_memory (me fusha të ndryshme për memorizimin e Kuranit)
  • Zgjidhja: Migrimet janë të vetëdijshme për aplikacionin. migrations/001_amal_user_memory.sql ekzekutohet vetëm kur APP_NAME=amal

Sfida 2: Sete të ndryshme funksionalitetesh

  • Thurayya ka feedback për tajweed; Amal nuk ka
  • Amal ka lojra fizike; Thurayya nuk ka
  • Zgjidhja: Flamuj funksionesh në konfigurim (enable_tajweed_feedback, enable_physics_games)

Sfida 3: Shkallëzim i pavarur

  • Amal ka rrjedhë trafiku; Thurayya është më qetë
  • Pula e Lambda-s së përbashkët konkuron për konkurrence
  • Zgjidhja: Politika të shkallëzimit CloudWatch për secilin aplikacion. Nëse Lambdat amal-* arrijnë kufirin e konkurencës, shkallëzohen automatikisht pavarësisht

Pyetje të Shpeshta

Pyetje: Ndajnë kodi për një bazë a krijon lidhje të forta midis aplikacioneve?

Përgjigje: Jo. Kodi i çdo aplikacioni është në direktorë të veçantë (apps/amal, apps/thurayya). Kodi i përbashkët është në packages/alphazed_common dhe versionohet në mënyrë eksplicite. Lidhjet e forta janë shenjë e dizajnit të dobët — i kapim gjatë rishikimit të kodit.

Pyetje: Çfarë nëse një aplikacion ka nevojë për ndryshim të thyer API-je?

Përgjigje: Ne versionojmë API-të për çdo aplikacion: /amal/v1/*, /thurayya/v1/*. Aplikacionet mund të përmirësohen pavarësisht. Versionet e vjetra mbeten aktive për 12 muaj, duke i dhënë ekipeve kohë për të përditësuar.

Pyetje: A mund aplikacionet të ndajnë përdorues?

Përgjigje: Jo automatikisht. Çdo aplikacion ka tabelën e vet të përdoruesve (me parapronë). Nëse një prind dëshiron të abonojë për Amal dhe Thurayya, krijon llogari të veçanta (ose mund të shtojmë më vonë një veçori lidhjeje "familjare").

Artikuj të Ngjashëm