Microservice đổi độ phức tạp trong code lấy độ phức tạp trong vận hành. Đội nhỏ thường chỉ tính phần đầu.
Chi phí bị bỏ sót:
- Deploy nhân lên. 12 service là 12 pipeline, 12 bộ config, 12 lần vá thư viện khi có CVE. Deploy tay không còn khả thi.
- Gỡ lỗi khó hơn hẳn. Stack trace không còn xuyên suốt; không có tracing và log tập trung thì một sự cố mất hàng giờ chỉ để xác định service nào lỗi.
- Môi trường dev nội bộ. Chạy cả hệ thống trên máy lập trình viên trở nên bất khả thi — phải đầu tư contract test, mock, hoặc môi trường dùng chung.
- Lỗi từng phần trở thành chuyện thường ngày. Timeout, retry, idempotency, message trùng — mỗi thứ là code phải viết và phải test.
- Nhất quán dữ liệu. Mất transaction chung, phải làm saga và chấp nhận eventual consistency, kèm công cụ đối soát khi lệch.
- On-call. Nhiều service, nhiều alert, cần biết ai sở hữu cái gì.
Năng lực cần có trước khi tách (prerequisites):
1. Provisioning nhanh — dựng môi trường mới bằng lệnh, không phải ticket chờ nhiều ngày.
2. CI/CD tự động cho từng service — deploy độc lập, rollback nhanh.
3. Giám sát cơ bản — metric, log tập trung, alert, tracing; đủ để biết hệ thống đang hỏng trước khi khách hàng báo.
4. Sở hữu rõ ràng — mỗi service có một đội chịu trách nhiệm cả vận hành, không phải "ai rảnh thì sửa".
Thiếu bốn thứ này thì tách service chủ yếu làm chậm đội lại. Với đội nhỏ, đáp án an toàn khi phỏng vấn: modular monolith trước, và chỉ tách phần nào có lý do cụ thể (scale riêng, nhịp release riêng, công nghệ riêng).