Microservice, polyglot và database-per-service
Vấn đề. Muốn tập triển khai lên cloud thì phải có thứ gì đủ "thật" để triển khai: nhiều service, nhiều ngôn ngữ, nhiều kiểu database. Một app monolith một file jar thì không dạy được bao nhiêu về DevOps.
Cách dự án làm. Cắt shop thành 5 service theo năng lực nghiệp vụ. Mỗi service sở hữu dữ liệu của riêng nó, không service nào đọc thẳng database của service khác. Muốn lấy dữ liệu thì phải hỏi qua API (REST, gRPC) hoặc nghe event.
| Service | Stack | Database | Việc chính |
|---|---|---|---|
| identity | Java 21, Spring Security | MySQL identity_db | Đăng ký, đăng nhập, cấp JWT |
| product | .NET 10 | MongoDB product_db | Catalog, tồn kho |
| cart | .NET 10 | MongoDB cart_db | Giỏ hàng, hỏi giá qua gRPC |
| order | Java 21 | MySQL order_db | Checkout, lịch sử đơn, phát event |
| notification | Java 21 | MySQL notification_db | Nghe OrderCreated, lưu thông báo |
Chọn database theo hình dạng dữ liệu: user, đơn hàng, thông báo là dữ liệu quan hệ, cần ràng buộc (MySQL). Sản phẩm và giỏ hàng là document linh hoạt (MongoDB).
- Database-per-service giúp mỗi service deploy, đổi schema độc lập.
- Đổi lại, không còn JOIN qua service; phải ghép dữ liệu bằng API hoặc GraphQL Federation (phần 9).
- Polyglot ở đây là để học; ở công ty thật thường chọn 1–2 stack để giảm chi phí vận hành.
- Không có transaction chung giữa các service: checkout phải tự bù trừ khi lỗi (phần 4).
- Debug khó hơn: cần correlation ID và trace (phần 15, 16).
Câu hỏi phỏng vấn
Khi nào không nên dùng microservice? Khi team nhỏ, domain chưa rõ ranh giới, hoặc chưa có CI/CD và observability. Lúc đó monolith chia module tốt thường rẻ hơn.
Database-per-service thì báo cáo tổng hợp làm sao? Dùng API composition, GraphQL Federation, hoặc đẩy event sang một kho đọc riêng (CQRS / data warehouse).