ADR-002: Modular Monolith với Matching Service riêng biệt¶
Trạng thái¶
Accepted
Ngày¶
2026-04-08
Người quyết định¶
Tech Lead
Architecture Drivers¶
D3 (Developer Experience), D4 (Đơn giản vận hành), D6 (Tốc độ đưa ra sản phẩm)
Bối cảnh¶
Hệ thống có 6 epic với 27 use cases. Đội phát triển gồm 2 senior fullstack. Triển khai on-premise không có đội Ops riêng. Chức năng AI Matching cần hệ sinh thái Python (thư viện NLP, ML framework cho GĐ2).
Các Phương Án Xem Xét¶
Phương án A: Modular Monolith (Java) + Matching Service riêng (Python)¶
- Ưu điểm: Single deploy cho business logic; ranh giới module rõ ràng; debug đơn giản; Python cho AI/ML; chỉ 2 services cần vận hành
- Nhược điểm: Không scale từng module riêng; single failure domain cho business logic
Phương án B: Full Microservices (6+ services)¶
- Ưu điểm: Scale riêng biệt; deploy riêng; đa dạng công nghệ
- Nhược điểm: Overhead vận hành rất lớn cho đội 2 người; debug distributed; latency mạng; eventual consistency phức tạp; cần K8s
Phương án C: Pure Monolith (toàn bộ trong Java, bao gồm matching)¶
- Ưu điểm: Deploy đơn giản nhất (single JAR); không giao tiếp inter-service
- Nhược điểm: Không tận dụng được hệ sinh thái Python AI/ML; khó phát triển matching riêng; không có upgrade path cho GĐ2 AI
Quyết Định¶
Sử dụng Phương án A: Modular Monolith + Matching Service riêng. Backend chính là một ứng dụng Spring Boot duy nhất với ranh giới module rõ ràng thực thi qua package structure và giao tiếp cross-module chỉ qua interface. Matching Service là service riêng duy nhất, chạy Python/FastAPI, giao tiếp qua REST API nội bộ.
Hệ Quả¶
Tích cực¶
- Đội 2 người quản lý được 2 services (không phải 6+)
- Ranh giới module cho phép tách thành services trong tương lai nếu cần
- Python Matching Service phát triển độc lập (thêm ML models GĐ2)
- Docker Compose deployment vẫn đơn giản
Tiêu cực¶
- Không scale từng module riêng
- Tất cả business modules chia sẻ cùng JVM — có thể tranh chấp memory/CPU
Rủi ro¶
- Ranh giới module có thể bị xói mòn theo thời gian → giảm thiểu bằng ArchUnit tests
Hành Động Tiếp Theo¶
- Thiết lập ArchUnit tests cho ranh giới module
- Định nghĩa module API interfaces trước khi implementation
- Tạo Docker Compose với 2 services + hạ tầng
Liên Quan¶
- ADR-010 (Python/FastAPI cho Matching Service)
- ADR-007 (Docker Compose deployment)