Tài liệu

Kiến trúc Backend

Kiến trúc backend NamO Academy Studio — Serverless Framework v4 trên AWS. Tổng quan kỹ thuật cho kiểm toán và đánh giá sản phẩm.

Cập nhật lần cuối: 2025-02

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ầnCông nghệMục đích
API layerAPI Gateway + LambdaHTTP endpoints cho create, edit, camera-sync, job status, upload presigned URL
AI workersLambda (vertex)Tạo ảnh chạy lâu (Vertex AI)
Orchestrationai-image serviceXác thực request, dự trữ quyền, tạo job, gọi workers qua Lambda async
Queue / asyncLambda InvocationType: EventGọi worker Lambda fire-and-forget (không dùng SQS)
StorageDynamoDB, S3, FirebaseJobs, usage, users, keys; media trong S3; boards/workflows trong Firebase
Refund processorLambda (DynamoDB Streams)Hoàn NamO Point khi job status chuyển sang failed
Image processingLambda (S3 trigger)Resizer xử lý uploads, tạo thumbnail/medium/large variants

3. Luồng request

3.1 Tạo ảnh

  1. Người dùng gửi request; API xác thực, kiểm tra quyền (credits hoặc daily limit).
  2. API tạo job trong database, gọi worker Lambda bất đồng bộ, trả về job ID ngay.
  3. Client polling status (pending → processing → completed | failed).
  4. 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.
  5. Resizer tạo thumbnail/medium/large; client nhận status completed và image URLs.

3.2 Edit & Texture Transfer

  1. Cùng mô hình async: API tạo job, gọi worker, trả về job ID.
  2. Client polling; worker dùng Vertex Imagen (edit) hoặc Gemini (camera sync), upload S3, cập nhật Firebase.

3.3 Upload

  1. Client yêu cầu presigned URL; upload trực tiếp lên S3.
  2. 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

ModelWorkerProviderNamO Point
nanobanana-basicnanobananaBasicGeneratebrowser-based worker2 per image (1K only)
nanobanana-provertexGenerateVertex AI — Gemini 3.0 Pro Image Preview (gemini-3.0-pro-image-preview)1 mỗi ảnh
nanobanana-2vertexGenerate / vertexEdit / vertexCameraSyncVertex 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 edit1 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ảngServiceMục đích
Jobsai-imageJobs generation, edit, camera-sync; streams cho refunds
Usageai-imageDaily limits theo user
UsersusersProfile, credits, role
PaymentspaymentsPayment 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áiBackendTrải nghiệm người dùng
QueuedJob đã tạo, worker được gọiResponse ngay với job_id
ProcessingWorker đang chạy, status cập nhậtPoll trả về processing
CompletedJob và workflow result cập nhật, resizer kích hoạtPoll trả về completed, image URLs có sẵn
FailedJob status set, credits hoànPoll 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                 │
  └─────────────────────────────────────────────────────────────────────────────┘