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
| Burimi | Përbashkët | Për Aplikacion | Arsyeja |
|---|---|---|---|
| Kodi Lambda | ✓ Po | ✗ Jo | Bazë 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 | ✓ Po | APNs + 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.sqlekzekutohet vetëm kurAPP_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").



