Đố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 scaling | Có | Các deployment k8s chạy 2 replica. Account, admin, apigateway, content có HPA (tự tăng/giảm số pod). |
| Availability: health check, failover | Một phần | Health 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ó |
|---|---|---|
| DNS | Chưa thấy | Khô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. |
| CDN | Có | 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 balancer | Có | Ingress k8s ở hầu hết service. |
| Reverse proxy, API gateway | Có | grapeseed-apigateway: YARP, OpenIddict, rate limit. |
| Microservices, service discovery | Có | 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 replica | Chưa thấy | Khô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. |
| Sharding | Chưa | Dữ 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 partitioning | Chưa | Khô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 view | Chưa thấy | Không thấy MATERIALIZED VIEW. Thường cần cho report khi join nhiều bảng lớn bị chậm. |
| NoSQL | Chưa | Dữ 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ỉ ở Redis | Có | 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 warming | Có | Việc warm cache S3 cho GSv4. |
| Message queue | Có | SQS: student-service gửi, Student.Worker nhận. notification-worker nhận. remote-teaching-service gửi. |
| Job chạy theo lịch | Có | Quartz trong worker-service, notification-service, nexus-service, grapeseed-account. |
| Pipeline theo sự kiện | Có | aws-lambda-functions: S3 event, encode bằng MediaConvert, rồi handler xử lý khi encode xong. |
| Rate limiting, back pressure | Một phần | Rate limit ở grapeseed-apigateway và grapeseed-account. Chưa thấy back pressure cho hàng đợi. |
| Pub/sub, event streaming (SNS, Kafka) | Chưa | SQS 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, saga | Chưa | Cầ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. |
| Idempotency | Một phần | grapeseed-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, RPC | Một phần | Service 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ấy | remote-teaching-service có nhắc tới SignalR, nhưng phần server realtime không nằm trong PRE. |
| Retry, circuit breaker | Có | Polly ở hầu hết service. |
| Security: auth, secret | Có | 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.