Đối chiếu với dự án PRE

Trạng thái Có thì mở repo xem cách làm thật. Chưa hoặc Chưa thấy thì chỉ học lý thuyết và nhớ lý do.

Scale và consistency (tuần 1)

Chủ đềỞ PREỞ đâu, hoặc vì sao chưa có
Horizontal scalingCóCác deployment k8s chạy 2 replica. Account, admin, apigateway, content có HPA (tự tăng/giảm số pod).
Availability: health check, failoverMột phầnHealth check ở hầu hết service. Admin, student, notification, nexus có project HealthProbe riêng. Failover database do AWS RDS lo, không nằm trong code.
Consistency (strong vs eventual)CóTrong một service là strong (cùng một Postgres). Giữa các service là eventual: dữ liệu đi qua SQS, cache, hoặc gọi API.

Đường đi của một request (tuần 2)

Chủ đềỞ PREỞ đâu, hoặc vì sao chưa có
DNSChưa thấyKhông có trong repo (không thấy external-dns hay Route53 trong deploy). Có thể được quản lý ở hạ tầng riêng.
CDNCógrapeseed-content: S3 + CloudFront. grapeseed-student-service: CloudFront signed URL cho media access. Media có 3 bản deploy GL/CN/RU, riêng RU dùng storage Yandex.
Load balancerCóIngress k8s ở hầu hết service.
Reverse proxy, API gatewayCógrapeseed-apigateway: YARP, OpenIddict, rate limit.
Microservices, service discoveryCóKhoảng 10 service tách theo domain. Gateway dùng ServiceDiscovery.Yarp.

Database (tuần 3–4)

Chủ đềỞ PREỞ đâu, hoặc vì sao chưa có
Federation (mỗi service một DB)Cógrapeseed-sql-scripts có DB riêng cho admin, content, notification, student, training.
Replication, read replicaChưa thấyKhông thấy connection string đọc riêng. Tải đọc đang giảm bằng cache. Cần khi Postgres quá tải vì query đọc mà cache không gánh được, ví dụ report chạy trên dữ liệu lớn.
ShardingChưaDữ liệu vẫn vừa trong một Postgres. Cần khi lượng ghi hoặc dung lượng vượt sức một máy.
Table partitioningChưaKhông thấy PARTITION BY. Cần khi bảng log học tập (ví dụ PlaylistPlayLog) lớn đến mức query hoặc xóa dữ liệu cũ bị chậm.
Denormalization, materialized viewChưa thấyKhông thấy MATERIALIZED VIEW. Thường cần cho report khi join nhiều bảng lớn bị chậm.
NoSQLChưaDữ liệu trường, lớp, học sinh, bài học có quan hệ rõ, hợp SQL. Redis chỉ làm cache. remote-teaching-service (hệ cũ) có cấu hình ElasticSearch, chưa rõ dùng để làm gì.

Cache và xử lý bất đồng bộ (tuần 5–6)

Chủ đềỞ PREỞ đâu, hoặc vì sao chưa có
Cache 2 tầng (memory + Redis)Cógrapeseed-content, grapeseed-student-service: FusionCache, tầng 1 memory, tầng 2 Redis, có backplane.
Cache chỉ ở RedisCógrapeseed-admin: EasyCaching với Redis. 2026-10-29 quyết định không dùng tầng memory vì rủi ro hết RAM (OOM).
Cache warmingCóViệc warm cache S3 cho GSv4.
Message queueCóSQS: student-service gửi, Student.Worker nhận. notification-worker nhận. remote-teaching-service gửi.
Job chạy theo lịchCóQuartz trong worker-service, notification-service, nexus-service, grapeseed-account.
Pipeline theo sự kiệnCóaws-lambda-functions: S3 event, encode bằng MediaConvert, rồi handler xử lý khi encode xong.
Rate limiting, back pressureMột phầnRate limit ở grapeseed-apigateway và grapeseed-account. Chưa thấy back pressure cho hàng đợi.
Pub/sub, event streaming (SNS, Kafka)ChưaSQS là point-to-point, mỗi message chỉ một nơi nhận, hiện đủ dùng. Cần khi nhiều service cùng phải phản ứng với một sự kiện.
Outbox, sagaChưaCần khi phải bảo đảm ghi DB và gửi message cùng thành công, hoặc một nghiệp vụ trải qua nhiều service.
IdempotencyMột phầngrapeseed-student-service: sync puzzle piece bỏ qua bản ghi trùng khi gửi lại. grapeseed-admin cũng có.

Giao tiếp và bảo mật (tuần 7)

Chủ đềỞ PREỞ đâu, hoặc vì sao chưa có
REST, RPCMột phầnService gọi nhau qua REST bằng Refit. Chưa có gRPC vì chưa có lời gọi nội bộ nào cần latency cực thấp.
Realtime (WebSocket)Chưa thấyremote-teaching-service có nhắc tới SignalR, nhưng phần server realtime không nằm trong PRE.
Retry, circuit breakerCóPolly ở hầu hết service.
Security: auth, secretCóOpenIddict ở grapeseed-apigateway và grapeseed-account. Secret lưu ở AWS Parameter Store.

Dựa trên package, file deploy và tìm kiếm code ngày 2026-10-29. Lý do ở các dòng "Chưa" là suy luận từ kiến trúc hiện tại, chưa hỏi lại team.