Alphazed, tek bir backend kod tabanı ve ortak Flutter mobil frameworkü kullanarak 7'den fazla eğitim uygulamasını (Amal, Thurayya, Qais, KidElite, Alphazed School, Alphazed Montessori ve daha fazlası) işletmektedir. Her uygulamanın kendine ait veritabanı tabloları (ön ekli), yapılandırması, push bildirimleri, e-posta şablonları ve içeriği bulunur; ancak kimlik doğrulama (AWS Cognito), analitik altyapısı ve temel öğrenme algoritmaları paylaşılır.
Backend: Çalışma Zamanı Uygulama Seçimi
Nasıl Çalışır
Yayınlama sırasında bir ortam değişkeni uygulamayı seçer:
# Amal'i dağıt
export APP_NAME=amal
serverless deploy
Thurayya'yı dağıt
export APP_NAME=thurayya
serverless deploy
Qais'i dağıt
export APP_NAME=qais
serverless deploy
Her dağıtım bağımsız Lambda fonksiyonları, API Gateway yolları ve izleme oluşturur; ancak hepsi aynı backend kod tabanına bağlanır.
Üç Aşamalı Konfigürasyon Önceliği
# src/config.py
import os
app_name = os.getenv('APP_NAME', 'amal')
Seviye 1: Tam uygulama eşleşmesi
config = load_json(f'config/{app_name}.json')
Seviye 2: Uygulama grubuna göre eşleşme (tam konfigürasyon yoksa)
if not config:
family = app_name.split('_')[0] # 'amal_beta' → 'amal'
config = load_json(f'config/{family}.json')
Seviye 3: Varsayılan
if not config:
config = load_json('config/default.json')
Uygulamaya Özel Konfigürasyon (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
}
}
Paylaşılan ve Uygulamaya Özel Kaynaklar
| Kaynak | Paylaşılan | Uygulamaya Özel | Neden |
|---|---|---|---|
| Lambda kodu | ✓ Evet | ✗ Hayır | Tek kod tabanı, APP_NAME bazlı dallanma |
| RDS örneği | ✓ Evet | ✗ Hayır (tablolar ön ekli) | Maliyet azaltma, tek yedekleme |
| S3 içerik | ✗ Hayır | ✓ Evet | Her uygulamanın kendi müfredatı var |
| AWS Cognito | ✓ Evet | ✗ Hayır (app_id ile) | Merkezi kimlik doğrulama, app_id ile ayırma |
| Analitik havuzu | ✓ Evet | ✗ Hayır (uygulama bazında bölümlenmiş) | Birleşik pipeline, ayrılmış veriler |
| Firebase mesajlaşma | ✗ Hayır | ✓ Evet | Uygulamaya özel APNs + FCM |
Ön Uç: Flutter Çoklu Uygulama Mimarisi
Ortak Çekirdek (packages/alphazed_common)
- Durum yönetimi (Riverpod)
- Ses işleme
- Animasyon kütüphanesi (Rive entegrasyonu)
- Tasarım sistemi (renkler, tipografi, widgetlar)
- Kimlik doğrulama akışları
- Analitik istemcisi
Uygulamaya Özel Katmanlar (apps/amal, apps/thurayya vb.)
apps/
├── amal/
│ ├── lib/
│ │ ├── main.dart (uygulama giriş noktası)
│ │ ├── config/
│ │ │ ├── curriculum.json (Amal ders yapısı)
│ │ │ ├── colors.dart (Amal teması)
│ │ │ └── characters.json (avatar özelleştirmesi)
│ │ └── screens/ (Amal'a özgü ekranlar)
│ └── pubspec.yaml (Amal bağımlılıkları)
│
├── thurayya/
│ ├── lib/
│ │ ├── main.dart (farklı giriş noktası)
│ │ ├── config/
│ │ │ ├── curriculum.json (Cuz Amma yapısı)
│ │ │ ├── colors.dart (Thurayya teması)
│ │ │ └── characters.json (avatar özelleştirmesi)
│ │ └── screens/ (Thurayya'ya özgü ekranlar)
│ └── pubspec.yaml (Thurayya bağımlılıkları)
│
└── packages/
└── alphazed_common/ (ortak kod)
Derleme Zamanı Konfigürasyonu
# Amal derle
flutter build apk --dart-define=APP_NAME=amal --dart-define=CURRICULUM=amal_v3
Thurayya derle
flutter build apk --dart-define=APP_NAME=thurayya --dart-define=CURRICULUM=thurayya_juzamma
Derleme sırasında her uygulamaya ait müfredat verisi, renkler ve konfigürasyon içine gömülür. Tek kod deposu, birden fazla derlenmiş uygulama ikilisi.
Dağıtım: Bağımsız Yığınlar
Serverless Framework Konfigürasyonu
# serverless.yml
service: alphazed-backend
custom:
pythonRequirements:
dockerizePip: true
app_name: ${env:APP_NAME}
functions:
APP_NAME değerine göre her dağıtımda oluşturulan fonksiyonlar
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:
# Her uygulama için ayrı CloudWatch log grubu
${self:custom.app_name}LogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: /aws/lambda/alphazed-${self:custom.app_name}
RetentionInDays: 30
APP_NAME=amal ile dağıttığınızda CloudFormation şunları yaratır:
alphazed-amal-*ön ekli Lambda fonksiyonları/amal/*altında API Gateway rotaları/aws/lambda/alphazed-amalCloudWatch logları- Bağımsız ölçeklendirme ve izleme
Bu Neden Önemli?
Ürün Ekipleri İçin
- Yeni uygulama lansmanı: aylar değil haftalar sürer (altyapı paylaşılır)
- Özellik paritesi: hata düzeltmeleri ve algoritma geliştirmeleri tüm uygulamalara anında yansır
- A/B testleri: özellikleri bir uygulamada kolayca test edip diğerlerine yayma
Mühendislik İçin
- Tek kod tabanı: bir test seti, tek CI/CD hattı
- Paylaşılan öğrenme algoritmaları: aralıklı tekrar ve içerik karışımı tüm uygulamalardan yararlanır
- Operasyonel verimlilik: tek ekip tüm altyapıyı yönetir
Maliyet Açısından
- Paylaşılan RDS: 7 bağımsız veritabanının maliyetinin yalnızca bir kısmı
- Paylaşılan Cognito: tüm uygulamalar için tek kimlik doğrulama sağlayıcısı
- Paylaşılan analitik: tek pipeline ile 7 uygulamaya hizmet
- Tahmini yıllık maliyet tasarrufu: 40.000-60.000 $ arası ayrı backendlere göre
Zorluklar ve Çözümler
Zorluk 1: Veritabanı şeması çakışmaları
- Amal,
amal_user_memorytablosuna ihtiyaç duyar - Thurayya, farklı alanlar içeren
thurayya_user_memorytablosuna ihtiyaç duyar (Kur'an ezberleme için) - Çözüm: Migrasyonlar uygulamaya özgüdür.
migrations/001_amal_user_memory.sqlyalnızcaAPP_NAME=amaliken çalıştırılır
Zorluk 2: Farklı özellik setleri
- Thurayya'da tecvid geri bildirimi var; Amal'da yok
- Amal'da fizik oyunları var; Thurayya'da yok
- Çözüm: Konfigürasyonda özellik bayrakları (örneğin
enable_tajweed_feedback,enable_physics_games)
Zorluk 3: Bağımsız ölçeklendirme
- Amal yoğun trafik alırken Thurayya sessizdir
- Paylaşılan Lambda havuzu, eşzamanlılık için rekabet yaratır
- Çözüm: Uygulamaya özel CloudWatch ölçeklendirme politikaları. Eğer
amal-*Lambdaları eşzamanlılık sınırına ulaşırsa, bağımsız otomatik ölçeklendirme devreye girer
SSS
S: Tek kod tabanını paylaşmak uygulamalar arasında bağımlılık yaratmaz mı?
C: Hayır. Her uygulamanın kodu ayrı dizinlerde (örneğin apps/amal, apps/thurayya) tutulur. Ortak kod packages/alphazed_common içinde ve açıkça versiyonlanır. Sıkı bağımlılık tasarım kokusu olarak görülür ve kod incelemede tespit edilir.
S: Bir uygulamanın kırıcı API değişikliğine ihtiyacı olursa?
C: API'ler uygulama bazında versiyonlanır: /amal/v1/*, /thurayya/v1/*. Uygulamalar bağımsız yükseltilebilir. Eski sürümler 12 ay çalışmaya devam eder, bu da ekiplerin güncelleme yapması için zaman tanır.
S: Uygulamalar kullanıcıları paylaşabilir mi?
C: Varsayılan olarak hayır. Her uygulamanın ayrı kullanıcı tablosu vardır (ön ekli). Bir aile hem Amal hem Thurayya'ya abone olmak isterse, ayrı hesaplar oluşturur (ya da gelecekte "aile" bağlantı özelliği ekleyebiliriz).



