Bỏ qua

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)