Họ đang đo gì
Bạn có biết cái giá vận hành của phân tán không, hay chỉ thấy nó hiện đại hơn.
Trả lời ngắn~30 giây
Mình chọn monolith có ranh giới module rõ ràng. Microservices giải quyết việc nhiều đội cần deploy độc lập nhau — đó là bài toán của tổ chức, không phải của code. Trước khi có bài toán đó, bạn nhận về: mọi lời gọi hàm thành lời gọi mạng có thể thất bại, transaction thành saga, debug cần tracing phân tán, và môi trường local cần chạy tám dịch vụ. Đổi lại gần như không được gì.
Giải thích sâu
Lập luận thường gặp cho microservices là “mở rộng độc lập từng phần”. Nó đúng về lý thuyết và hiếm khi là ràng buộc thật: chạy thêm instance của cả monolith gần như luôn rẻ hơn chi phí kỹ sư của việc tách dịch vụ, cho tới khi một thành phần có hồ sơ tài nguyên KHÁC HẲN — ví dụ xử lý video ngốn CPU bên cạnh một API chủ yếu chờ I/O. Đó mới là lý do kỹ thuật hợp lệ để tách, và nó tách đúng một thứ chứ không tách tất cả.
Điều quan trọng là monolith không có nghĩa là code lộn xộn. Modular monolith giữ ranh giới rõ ràng trong cùng một tiến trình: mỗi module có API công khai riêng, không được truy cập bảng của module khác, và có thể có schema riêng trong cùng database. Làm được vậy thì việc tách thành dịch vụ sau này là một refactor có kế hoạch chứ không phải một cuộc viết lại — bạn đã trả trước phần khó là xác định ranh giới.
Về chi phí phân tán, con số đáng nhớ: một lời gọi hàm là nano giây, một lời gọi mạng trong cùng vùng là khoảng nửa mili giây. Chênh nhau sáu bậc. Một endpoint gọi qua năm dịch vụ đã tốn vài mili giây chỉ cho mạng, và mỗi bước là một chỗ có thể timeout. Đó là lý do một kiến trúc microservices thiết kế kém thường CHẬM hơn monolith nó thay thế.
Câu hỏi tiếp theo họ sẽ hỏi
?Vậy khi nào thì tách?
Khi việc phối hợp deploy trở thành nút thắt — nhiều đội phải chờ nhau để phát hành; khi một thành phần có yêu cầu tài nguyên hoặc mức sẵn sàng khác hẳn; hoặc khi một phần cần cách ly vì lý do tuân thủ. Ba dấu hiệu này đều đo được, khác với “nghe nói nó tốt hơn”.
?Tách bằng cách nào cho an toàn?
Strangler fig: dựng dịch vụ mới bên cạnh, định tuyến dần từng đường đi qua nó, giữ đường cũ cho tới khi lưu lượng về không. Không có giai đoạn “tắt cái cũ bật cái mới”, nên luôn lùi được.
Trả lời thế này là mất điểm
- Tách dịch vụ theo tầng kỹ thuật (dịch vụ database, dịch vụ business logic). Đó là monolith phân tán — tệ hơn cả hai lựa chọn.
- Không nhắc tới chi phí vận hành: CI/CD nhân lên, tracing, phát hiện dịch vụ, môi trường local.