Tek Kod Tabanıyla Birden Fazla Eğitim Uygulaması Nasıl Geliştirdik?
5 dk okumaMohammad Shaker

Tek Kod Tabanıyla Birden Fazla Eğitim Uygulaması Nasıl Geliştirdik?

Alphazed, tek backend kod tabanı ve ortak Flutter altyapısıyla 7'den fazla eğitim uygulamasını yönetiyor.

Engineering

Hızlı cevap

Alphazed, tek backend kod tabanı ve ortak Flutter altyapısıyla 7'den fazla eğitim uygulamasını yönetiyor.

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

KaynakPaylaşılanUygulamaya ÖzelNeden
Lambda kodu✓ Evet✗ HayırTek kod tabanı, APP_NAME bazlı dallanma
RDS örneği✓ Evet✗ Hayır (tablolar ön ekli)Maliyet azaltma, tek yedekleme
S3 içerik✗ Hayır✓ EvetHer 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✓ EvetUygulamaya ö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-amal CloudWatch 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_memory tablosuna ihtiyaç duyar
  • Thurayya, farklı alanlar içeren thurayya_user_memory tablosuna ihtiyaç duyar (Kur'an ezberleme için)
  • Çözüm: Migrasyonlar uygulamaya özgüdür. migrations/001_amal_user_memory.sql yalnızca APP_NAME=amal iken ç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).

İlgili Makaleler