কিভাবে একক কোডবেস থেকে মাল্টি-অ্যাপ প্ল্যাটফর্ম তৈরি করলাম
Alphazed একক ব্যাকএন্ড কোডবেস ও শেয়ার্ড Flutter মোবাইল ফ্রেমওয়ার্ক থেকে ৭টিরও বেশি শিক্ষামূলক অ্যাপ (Amal, Thurayya, Qais, KidElite, Alphazed School, Alphazed Montessori ইত্যাদি) পরিচালনা করে। প্রতিটি অ্যাপ নিজস্ব ডাটাবেস টেবিল (প্রিফিক্স সহ), কনফিগারেশন, পুশ নোটিফিকেশন, ইমেইল টেমপ্লেট এবং কনটেন্ট পায়—তবে অথেনটিকেশন (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 গেটওয়ে রুট এবং মনিটরিং তৈরি করে—তবে সব একই ব্যাকএন্ড কোডবেসের সাথে যুক্ত থাকে।
তিন-স্তরের কনফিগ অগ্রাধিকার
# src/config.py
import os
app_name = os.getenv('APP_NAME', 'amal')
স্তর ১: সঠিক অ্যাপ ম্যাচ
config = load_json(f'config/{app_name}.json')
স্তর ২: অ্যাপ ফ্যামিলি ম্যাচ (যদি সঠিক কনফিগ না থাকে)
if not config:
family = app_name.split('_')[0] # 'amal_beta' থেকে 'amal'
config = load_json(f'config/{family}.json')
স্তর ৩: ডিফল্ট
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 (Juz Amma পরিকল্পনা)
│ │ │ ├── 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 Framework কনফিগারেশন
# 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:
# প্রতিটি অ্যাপের নিজস্ব ক্লাউডওয়াচ লগ গ্রুপ
${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 গেটওয়ে রুট `/amal/*`
- ক্লাউডওয়াচ লগ `/aws/lambda/alphazed-amal`
- স্বতন্ত্র স্কেলিং এবং মনিটরিং
কেন এটা গুরুত্বপূর্ণ
প্রোডাক্ট টিমের জন্য
- নতুন অ্যাপ লঞ্চ: মাস না নিয়ে সপ্তাহেই (ইনফ্রাস্ট্রাকচার শেয়ার)
- ফিচার প্যারিটি: বাগ ফিক্স ও অ্যালগরিদম উন্নতি দ্রুত সব অ্যাপে
- A/B টেস্টিং: সহজে এক অ্যাপে পরীক্ষা করে অন্য অ্যাপে প্রয়োগ
ইঞ্জিনিয়ারিংয়ের জন্য
- একক কোডবেস: একবার টেস্ট, এক CI/CD পাইপলাইন
- শেয়ার্ড শেখার অ্যালগরিদম: সমস্ত অ্যাপের জন্য spaced repetition ও কনটেন্ট মিক্সিং সুবিধা
- অপারেশনাল দক্ষতা: এক টিম সমস্ত অবকাঠামো ম্যানেজ করে
খরচের জন্য
- শেয়ার্ড RDS: ৭টি স্বাধীন ডাটাবেসের তুলনায় অনেক কম খরচ
- শেয়ার্ড Cognito: সকল অ্যাপের জন্য এক অথ প্রোভাইডার
- শেয়ার্ড অ্যানালিটিক্স: ৭টি অ্যাপের জন্য এক পাইপলাইন
- প্রাক্কলিত খরচ সাশ্রয়: বছরে $৪০,০০০-৬০,০০০ পৃথক ব্যাকএন্ডের তুলনায়
চ্যালেঞ্জ এবং সমাধান
চ্যালেঞ্জ ১: ডাটাবেস স্কিমা সংঘর্ষ
- Amal এর জন্য `amal_user_memory` টেবিল
- Thurayya এর জন্য `thurayya_user_memory` টেবিল (কুরআন মুখস্থকরণের বিভিন্ন ক্ষেত্র)
- সমাধান: মাইগ্রেশন অ্যাপ-অ্যাওয়ার।
migrations/001_amal_user_memory.sqlশুধুমাত্র যখনAPP_NAME=amal
চ্যালেঞ্জ ২: ভিন্ন ফিচার সেট
- Thurayya-তে তাজওয়ীদ ফিডব্যাক আছে; Amal-এ নেই
- Amal-এ ফিজিক্স গেম আছে; Thurayya-তে নেই
- সমাধান: কনফিগ ফিচার ফ্ল্যাগ (
enable_tajweed_feedback,enable_physics_games)
চ্যালেঞ্জ ৩: স্বাধীন স্কেলিং
- Amal-এ ট্রাফিক বাড়ে; Thurayya শান্ত
- একই Lambda পুল শেয়ারিংয়ে কনকারেন্সি লিমিটে প্রতিযোগিতা
- সমাধান: CloudWatch স্কেলিং পলিসি প্রতিটি অ্যাপের জন্য স্বাধীন। যখন
amal-*Lambdas concurrency সীমায় পৌঁছায়, স্বয়ংক্রিয় স্কেলিং হয়
সাধারণ প্রশ্ন
প্রঃ একটি কোডবেস শেয়ার করলে অ্যাপগুলোর মধ্যে coupling হয় না?
উঃ নয়। প্রতিটি অ্যাপের কোড আলাদা ডিরেক্টরিতে (apps/amal, apps/thurayya) থাকে। শেয়ার্ড কোড packages/alphazed_common তে ও স্পষ্টভাবে সংস্করণ নিয়ন্ত্রিত। কঠোর coupling ডিজাইন সমস্যা, যা কোড রিভিউয়ে ধরা হয়।
প্রঃ যদি একটি অ্যাপে API ব্রেকিং পরিবর্তন দরকার হয়?
উঃ আমরা প্রতিটি অ্যাপের জন্য সংস্করণ নির্ধারণ করি: /amal/v1/*, /thurayya/v1/*। অ্যাপগুলো স্বাধীনভাবে আপগ্রেড করতে পারে। পুরানো সংস্করণ ১২ মাস চলে, যা অ্যাপ টিমকে আপডেট করার সময় দেয়।
প্রঃ কি অ্যাপগুলো ব্যবহারকারী শেয়ার করতে পারে?
উঃ ডিফল্ট নয়। প্রতিটি অ্যাপের নিজস্ব ইউজার টেবিল (প্রিফিক্স সহ) থাকে। যদি অভিভাবক দুটির সাবস্ক্রিপশন চান, তাহলে আলাদা অ্যাকাউন্ট করতে হবে (অথবা ভবিষ্যতে "ফ্যামিলি" লিঙ্কিং ফিচার যুক্ত করতে পারি)।



