2026Backend DeveloperAcademic / System Architecture

Hệ thống quản lý kho StockFlow Cloud

Hệ thống quản lý kho linh kiện điện tử chuyên nghiệp cho chuỗi cửa hàng nhiều chi nhánh. Được thiết kế theo kiến trúc Serverless lai (Hybrid Serverless) trên nền tảng AWS, kết hợp giữa NestJS API và Lambda Workers điều phối bởi Step Functions để xử lý các tác vụ bất đồng bộ nặng.

Hệ thống quản lý kho StockFlow Cloud
01 — Tổng quan

Bài toán cần giải

Quản lý tồn kho đa chi nhánh đòi hỏi tính đồng bộ thời gian thực, khả năng xử lý file Excel nhập kho dung lượng lớn mà không gây nghẽn hệ thống và bảo đảm tính toàn vẹn dữ liệu giao dịch.

Mục tiêu của dự án là xây dựng hệ thống StockFlow Cloud giúp quản lý hàng tồn kho, luồng chuyển kho giữa các chi nhánh thời gian thực và tự động hóa quy trình nhập kho Excel thông qua Step Functions.

Hệ thống sử dụng kiến trúc kết hợp (Hybrid Serverless) nhằm tối ưu hiệu năng: API chính chạy trên container ECS Fargate, còn các luồng import, báo cáo và đối soát chạy dưới dạng serverless Lambdas để tiết kiệm chi phí và tự động co giãn.

Vai tròBackend Developer
Thời gian4 tháng · 2026
Đội ngũ2 người
Nền tảngWeb · Cloud · API
StackNestJS · AWS SAM · Next.js
02 — Công nghệ

Stack sử dụng

Backend & APILõi nghiệp vụ chạy 24/7
NestJS 10TypeScriptPrisma ORMREST API
Cloud · AWSHạ tầng & điều phối
ECS FargateALBLambdaStep FunctionsEventBridgeS3SQS (DLQ)CognitoCloudFront
Dữ liệu & RealtimeLưu trữ & đồng bộ
Aurora Serverless v2RDS ProxyPusher Channels
Build & IaCĐóng gói & triển khai
AWS SAMTerraformDockeresbuildTurborepo
03 — Kiến trúc & Công nghệ

Bên trong hệ thống

StockFlow Cloud không kể câu chuyện theo từng màn hình nghiệp vụ, mà xoay quanh cách hệ thống được kiến trúc để xử lý tác vụ nặng bất đồng bộ một cách an toàn và tiết kiệm. Dưới đây là bản đồ kiến trúc, pipeline điều phối bởi Step Functions và những quyết định kỹ thuật cốt lõi bảo đảm tính toàn vẹn dữ liệu.

Kiến trúc tổng thể — Hybrid ServerlessPhóng to
Kiến trúc tổng thể — Hybrid Serverless

Web Client (Next.js trên S3 + CloudFront) giao tiếp với NestJS API chạy container trên ECS Fargate phía sau ALB. Các tác vụ nặng (import Excel, báo cáo, đối soát) tách hẳn khỏi API chính và chạy ngầm qua S3 Event → EventBridge → Step Functions → Lambda Workers.

Pipeline Ingestion

Luồng nạp dữ liệu Human-in-the-Loop

  1. 01

    Trigger

    S3 · EventBridge

    File Excel được upload trực tiếp từ trình duyệt lên S3 qua Presigned URL. S3 Event Notification kích hoạt EventBridge khởi chạy State Machine — không gây tải lên API chính.

  2. 02

    Validator Lambda

    Step Functions

    Kiểm tra định dạng MIME và xác thực tiêu đề các cột (headers) có khớp chuẩn template trước khi đọc dữ liệu.

  3. 03

    Parser Lambda

    Step Functions

    Stream-parse file dung lượng lớn (tiết kiệm bộ nhớ), validate từng dòng, ghi vào bảng tạm import_job_rows kèm hash key chống trùng lặp.

  4. 04

    HaltForUserApproval

    Step Functions⏸ Tạm dừng chờ phê duyệt

    Lưu taskToken ứng với importJobId vào DB rồi tạm dừng. State Machine treo chờ tín hiệu từ con người (waitForTaskToken).

  5. 05

    Confirm

    Người dùng · Backend API

    Thủ kho xem bảng Preview (dòng hợp lệ / dòng lỗi / tác động tồn kho dự kiến). Khi bấm Xác nhận, API đọc taskToken và gửi SendTaskSuccess lên Step Functions.

  6. 06

    Writer Lambda

    Step Functions

    State Machine resume, ghi dữ liệu chính thức vào kho theo lô Batch 500 dòng trong một DB Transaction an toàn — lỗi giữa chừng sẽ rollback hoàn toàn.

Điểm sáng kỹ thuật

Quyết định bảo đảm toàn vẹn dữ liệu

Idempotency — chống ghi đè kho trùng lặp

Khi Writer Lambda lỗi mạng giữa chừng, SQS tự động retry message. Mỗi dòng Excel có một hash key duy nhất; trước khi ghi, hệ thống kiểm tra key đã tồn tại chưa để bỏ qua, đảm bảo tồn kho không bị cộng dồn hai lần.

TypeScript
const idempotencyKey = sha256(
  `${importJobId}:${rowNumber}:${sku}`
);

if (await rowAlreadyWritten(idempotencyKey)) {
  return; // đã ghi → bỏ qua an toàn
}
await writeInventoryRow(row, idempotencyKey);

Optimistic Locking — chống race condition

Khi nhiều chi nhánh duyệt chuyển kho đồng thời trên cùng một mặt hàng, cột version đóng vai trò khóa lạc quan. Nếu affected rows = 0 nghĩa là dữ liệu đã bị thay đổi → rollback và yêu cầu thử lại.

SQL
UPDATE inventory
SET quantity = quantity - $qty,
    version  = version + 1
WHERE branch_id    = $branch
  AND component_id = $component
  AND quantity    >= $qty
  AND version      = $currentVersion;
-- affected_rows = 0  →  conflict, rollback

Connection Pooling — sống sót khi Lambda scale-out

Lambda scale theo số request đồng thời rất dễ làm cạn connection pool của Postgres truyền thống. Hệ thống đi qua RDS Proxy (gộp & tái dùng kết nối phía trước Aurora Serverless v2) và giới hạn mỗi container Lambda chỉ giữ tối đa 1 kết nối.

env
DATABASE_URL=postgres://user:pass@rds-proxy-endpoint:5432/db
  ?connection_limit=1
# qua RDS Proxy → gộp connection cho Aurora Serverless
# mỗi Lambda container → tối đa 1 connection
Năng lực hệ thống

Những gì StockFlow làm được

01

Tồn kho đa chi nhánh thời gian thực

Phân tách 3 trạng thái: tồn vật lý (quantity), tạm giữ (reserved) và sẵn sàng bán (available). Cảnh báo Low Stock real-time theo ngưỡng từng chi nhánh.

02

Pipeline import Excel bất đồng bộ

Upload thẳng lên S3 qua Presigned URL, stream-parse file lớn, kèm cơ chế Import Preview duyệt trước khi ghi kho thật.

03

Chuyển kho nguyên tố & an toàn

Luồng phê duyệt giữ hàng (reserved), DB Transaction đảm bảo nhất quán giữa chi nhánh gửi — nhận, ghi Stock Movement Ledger để đối soát.

04

Đối soát kho tự động hằng đêm

Lambda Cron quét và so khớp tồn kho hiện thời với tổng biến động trong Ledger, tự sinh Reconciliation Issue khi phát hiện sai lệch.

05

Quản trị lỗi với DLQ Replay

Job import lỗi nghiêm trọng rơi vào SQS DLQ. Admin có bảng điều khiển xem, Discard hoặc Replay an toàn nhờ idempotency.

06

Báo cáo bất đồng bộ & RBAC

Xuất báo cáo lớn qua SQS → Lambda → S3 → Presigned URL. Bảo mật Cognito User Pool với 3 vai trò ADMIN / STORE_MANAGER / WAREHOUSE.

05 — Kết quả

Tác động

100%
Độ chính xác giao dịch (Idempotency)
500 dòng/batch
Quy mô ghi dữ liệu tồn kho tối ưu
100ms
Thời gian khởi động lạnh Lambda (esbuild)
Dự án tiếp theo

Hệ thống y tế Sepolia Health

Sắc vũ trụ