1. Tổng quan kiến trúc
Backend NamO Academy Studio là triển khai đa dịch vụ Serverless Framework v4 trên AWS. Các dịch vụ được triển khai độc lập dưới dạng các CloudFormation stack riêng biệt, chia sẻ bảng DynamoDB, bucket S3 và cấu hình Cognito theo quy ước.
Luồng chính:
- Người dùng xác thực qua Amazon Cognito và gọi các endpoint HTTP của API Gateway.
- Luồng tạo ảnh AI là bất đồng bộ: API tạo bản ghi job, gọi worker Lambda và trả về ngay. Client polling trạng thái job theo job_id.
- Ảnh tạo được tải lên S3 và liên kết với thực thể workflow/board trên Firebase cho UI sản phẩm.
- Job thất bại kích hoạt hoàn tiền NamO Point tự động qua DynamoDB Streams.
Region: ap-southeast-1 (Singapore)
2. Thành phần Backend chính
| Thành phần | Công nghệ | Mục đích |
|---|---|---|
| API layer | API Gateway + Lambda | HTTP endpoints cho create, edit, camera-sync, job status, upload presigned URL |
| AI workers | Lambda (vertex) | Tạo ảnh chạy lâu (Vertex AI) |
| Orchestration | ai-image service | Xác thực request, dự trữ quyền, tạo job, gọi workers qua Lambda async |
| Queue / async | Lambda InvocationType: Event | Gọi worker Lambda fire-and-forget (không dùng SQS) |
| Storage | DynamoDB, S3, Firebase | Jobs, usage, users, keys; media trong S3; boards/workflows trong Firebase |
| Refund processor | Lambda (DynamoDB Streams) | Hoàn NamO Point khi job status chuyển sang failed |
| Image processing | Lambda (S3 trigger) | Resizer xử lý uploads, tạo thumbnail/medium/large variants |
3. Luồng request
3.1 Tạo ảnh
- Người dùng gửi request; API xác thực, kiểm tra quyền (credits hoặc daily limit).
- API tạo job trong database, gọi worker Lambda bất đồng bộ, trả về job ID ngay.
- Client polling status (pending → processing → completed | failed).
- Worker gọi AI provider (Vertex AI hoặc worker chạy trên trình duyệt), upload kết quả lên S3, cập nhật workflow trong Firebase.
- Resizer tạo thumbnail/medium/large; client nhận status completed và image URLs.
3.2 Edit & Texture Transfer
- Cùng mô hình async: API tạo job, gọi worker, trả về job ID.
- Client polling; worker dùng Vertex Imagen (edit) hoặc Gemini (camera sync), upload S3, cập nhật Firebase.
3.3 Upload
- Client yêu cầu presigned URL; upload trực tiếp lên S3.
- S3 trigger chạy resizer; resizer cập nhật Firebase với resized URLs.
4. Tổng quan Services
ai-image
Điều phối generation, edit, camera-sync; xác thực request, tạo job, gọi workers
vertex
Tạo ảnh Vertex AI, edit (inpaint/outpaint), camera sync
uploads
Presigned S3 URLs; resizer tạo thumbnail/medium/large
downloads
Presigned download URLs ngắn hạn
users
User CRUD, usage, đồng bộ Cognito
payments
Payment links, webhook, tỷ giá
refundation
Hoàn NamO Point tự động khi job fail (DynamoDB Streams)
5. Điều phối AI và Workflow Routing
Model-to-Service Mapping
| Model | Worker | Provider | NamO Point |
|---|---|---|---|
| nanobanana-basic | nanobananaBasicGenerate | browser-based worker | 2 per image (1K only) |
| nanobanana-pro | vertexGenerate | Vertex AI — Gemini 3.0 Pro Image Preview (gemini-3.0-pro-image-preview) | 1 mỗi ảnh |
| nanobanana-2 | vertexGenerate / vertexEdit / vertexCameraSync | Vertex AI — Gemini 3.1 Flash Image Preview (gemini-3.1-flash-image-preview) cho generate/texture-transfer; Imagen 3.0 (imagen-3.0-capability-001) cho edit | 1 mỗi ảnh |
Vertex AI models đang sử dụng
- vertexGenerate → Gemini 3.0 Pro Image Preview (gemini-3.0-pro-image-preview)
- vertexEdit → Imagen 3.0 (imagen-3.0-capability-001)
- vertexCameraSync → Gemini 3.1 Flash Image Preview (gemini-3.1-flash-image-preview)
Xử lý lỗi và Retry
- Vertex AI: Exponential backoff retry (tối đa 5 lần) cho 429, 5xx, timeout, lỗi mạng.
- Job failure: Worker set job status thành failed với error_message; refundation stream hoàn credit.
6. Dữ liệu & Storage
DynamoDB
| Bảng | Service | Mục đích |
|---|---|---|
| Jobs | ai-image | Jobs generation, edit, camera-sync; streams cho refunds |
| Usage | ai-image | Daily limits theo user |
| Users | users | Profile, credits, role |
| Payments | payments | Payment records, exchange rates |
S3
Bucket: Media bucket (theo stage)
Paths: uploads/, resized/ (thumbnail, medium, large)
Metadata: Liên kết project, board, workflow cho UI
Firebase
Boards, workflows, board items, workflow results — product hierarchy và UI state. Workflow results lưu image URLs; resizer cập nhật thumbnail/medium/large variants.
Job Metadata
- Jobs lưu status, prompt, model, credits, image URLs, timestamps. Edit jobs gồm mask và mode.
7. Bảo mật và Kiểm soát vận hành
Authentication / Authorization
- Cognito User Pools — JWT trong header Authorization.
- Protected: generation, edit, upload, users, payments. Unprotected: job status (theo ID), download, exchange rate, payment webhook (signature verified).
Quản lý Secrets
- Firebase, Vertex AI, payment provider credentials qua environment và AWS Secrets Manager.
Kiểm soát Usage
- NamO Point: Trừ khi tạo job; hoàn khi job fail qua refundation stream.
- nanobanana-basic: 3 credits mỗi ảnh, chỉ 1K (không giới hạn theo ngày).
- Vertex model gating: nanobanana-2 giới hạn cho admin role.
Logging / Monitoring
Logs được chuyển tới external monitoring. Lambda logs có trong CloudWatch.
8. Triển khai
Stages: dev, prod, live. Mỗi service triển khai như CloudFormation stack riêng.
Cấu hình theo môi trường qua .env.
Runtime
- Node.js trên AWS Lambda
- Region: ap-southeast-1 (Singapore)
9. Độ tin cậy và hành vi sản phẩm
| Trạng thái | Backend | Trải nghiệm người dùng |
|---|---|---|
| Queued | Job đã tạo, worker được gọi | Response ngay với job_id |
| Processing | Worker đang chạy, status cập nhật | Poll trả về processing |
| Completed | Job và workflow result cập nhật, resizer kích hoạt | Poll trả về completed, image URLs có sẵn |
| Failed | Job status set, credits hoàn | Poll trả về failed, error_message hiển thị |
Tất cả thao tác AI đều bất đồng bộ. Client phải poll để biết hoàn thành. Không có queue service rõ ràng; Lambda async invocation cung cấp buffering.
Lambda concurrency do AWS quản lý. Vertex AI: retry khi 429.
Biện pháp bảo vệ:
- NamO Point trừ trước khi invoke; hoàn khi failure.
- Daily limits cho free-tier model.
- Worker timeouts (tối đa 900s) ngăn invocations chạy quá lâu.
Sơ đồ kiến trúc
┌─────────────────────────────────────────────────────────────────────────────────┐
│ NamO Academy Studio Backend │
└─────────────────────────────────────────────────────────────────────────────────┘
[Client]
│
│ JWT (Cognito)
▼
┌─────────────────┐
│ API Gateway │
└────────┬────────┘
│
┌─────┴─────┬───────────────┬──────────────┐
▼ ▼ ▼ ▼
┌──────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│users │ │payments │ │uploads │ │downloads│
└──────┘ └─────────┘ └────┬────┘ └────┬────┘
│ │
▼ ▼
┌──────────────────────────────────────────────────────────────────────────────┐
│ ai-image (Orchestration) │
│ • POST /create → create job(s) → invoke vertexGenerate | nanobananaBasicGenerate │
│ • POST /edit → create job → invoke vertexEdit │
│ • POST /camera-sync → create job → invoke vertexCameraSync │
│ • GET /job/{id}, /edit-job/{id}, /camera-sync-job/{id} → poll status │
└──────────────────────────────┬───────────────────────────────────────────────┘
│ Lambda Invoke (async, Event)
┌─────────────────────┼─────────────────────┐
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────────┐
│ vertexGenerate │ │ vertexEdit │ │ vertexCameraSync │
│ (Vertex AI) │ │ (Vertex Imagen) │ │ (Gemini) │
└────────┬────────┘ └────────┬─────────┘ └────────────┬────────────┘
│ │ │
│ ┌─────────────────┘ │
│ │ │
▼ ▼ │
┌─────────────────┐ │
│ nanobananaBasicGenerate │ (browser-based worker) │
└────────┬────────┘ │
│ │
└─────────────────────┬───────────────────────────┘
│
▼
┌─────────────────┐ ┌──────────────┐
│ Vertex AI / │ │ uploads │ presigned URL
│ Browser worker │ │ Lambda │ → S3 PutObject
└─────────────────┘ └──────┬───────┘
│
▼
┌──────────┐
│ S3 │ uploads/, resized/
│ Bucket │
└────┬─────┘
│ s3:ObjectCreated
▼
┌──────────┐
│ resizer │ → Firebase board/workflow
│ Lambda │
└──────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│ DynamoDB Streams (Generate, Edit, CameraSync Job tables) │
│ status → "failed" ──────────────────────► refundation Lambda │
│ (NamO Point refund) │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│ Storage │
│ • DynamoDB: jobs, usage, users │
│ • S3: media (uploads/, resized/) │
│ • Firebase: boards, workflows, board items, workflow results │
└─────────────────────────────────────────────────────────────────────────────┘