Blog

Tôi đã đốt sạch ngân sách cloud vì ảo tưởng về Java Spring Boot trong microservices

25/06/2026

Tôi đã đốt sạch ngân sách cloud vì ảo tưởng về Java Spring Boot trong microservices

Hồi năm 2021, tôi nhận dự án xây dựng một hệ thống cổng thanh toán cho một startup ví điện tử. Lúc đó, tôi tự tin chọn Java Spring Boot làm nền tảng cho toàn bộ hệ thống microservices của mình. Tôi đinh ninh rằng với hệ sinh thái cực kỳ mạnh mẽ của Java, việc scale hệ thống chỉ là chuyện nhỏ, thiếu tài nguyên thì cứ nâng RAM, nâng CPU trên cloud là xong. Tôi đã quá chủ quan khi nghĩ rằng phần cứng rẻ hơn tiền công ngồi tối ưu code.

Thế rồi ngày mở bán chiến dịch đầu tiên đến. Chỉ trong vòng mười phút đầu, lượng truy cập tăng vọt gấp hai mươi lần bình thường. Hệ thống bắt đầu chậm dần rồi sập hoàn toàn. RAM của các container chạy Spring Boot nhảy vọt lên ngưỡng 100% rồi bị cơ chế Out Of Memory của Kubernetes quét sạch. Suốt mười hai tiếng đồng hồ sau đó, tôi và cả đội phải thức trắng đêm để nâng cấu hình server lên mức tối đa, đốt sạch gần năm nghìn đô tiền cloud chỉ trong một đêm để cứu vãn tình thế. Khách hàng giận dữ đòi bồi thường, còn tôi thì run rẩy nhìn biểu đồ chi phí tăng dựng đứng mà không biết phải làm sao.

Khoảnh khắc vỡ lẽ đến vào khoảng bốn giờ sáng, khi tôi ngồi phân tích log và phát hiện ra thủ phạm chính là quá trình garbage collection của Java. Khi lượng request quá lớn, JVM liên tục phải dừng mọi hoạt động để dọn dẹp bộ nhớ, tạo ra những khoảng trễ chết người khiến hệ thống nghẽn cổ chai. Tôi nhận ra mình đã quá ngây thơ khi nghĩ cứ ném tiền vào RAM là giải quyết được vấn đề hiệu năng backend.

  • Tôi ngừng việc lạm dụng tài nguyên phần cứng để che giấu những đoạn code chưa tối ưu.
  • Tôi bắt đầu học cách đo đạc chi tiết lượng RAM thực tế mà mỗi microservice tiêu thụ khi ở trạng thái nghỉ và khi chịu tải cao.
  • Tôi nhận ra việc chọn ngôn ngữ lập trình phải dựa trên bài toán kinh tế và giới hạn phần cứng thực tế chứ không phải theo thói quen cũ.
  • Tôi bắt tay vào nghiên cứu Rust để tìm kiếm một giải pháp thay thế có khả năng kiểm soát bộ nhớ chặt chẽ hơn mà không cần garbage collection.

Việc chuyển hướng sang tìm hiểu Rust đã mở ra cho tôi một tư duy hoàn toàn mới về tối ưu microservices. Rust không có cơ chế garbage collection như Java, nó quản lý bộ nhớ thông qua cơ chế ownership tại thời điểm biên dịch. Điều này có nghĩa là hệ thống chạy cực kỳ nhanh, tốn rất ít RAM và không bao giờ bị dừng đột ngột để dọn rác. Khi viết cùng một service xử lý giao dịch bằng Rust, lượng RAM tiêu thụ giảm từ 500MB xuống chỉ còn chưa đầy 15MB, một con số không tưởng đối với tôi lúc bấy giờ.

Trước đây, cứ thấy hệ thống chậm là tôi nghĩ ngay đến chuyện tăng cấu hình server hoặc thêm instance mới. Bây giờ, tôi luôn bắt đầu bằng việc tối ưu hóa cách quản lý bộ nhớ và cấu trúc dữ liệu. Tôi không còn viết code theo kiểu chạy được là được nữa, mà luôn tính toán xem mỗi dòng code sẽ chiếm dụng bao nhiêu tài nguyên khi chạy thực tế trên môi trường production.

Giờ đây, khi vận hành Thiện Quang Technologies, tôi mang toàn bộ những bài học đắt giá này vào từng dự án của khách hàng. Chúng tôi không tư vấn cho khách hàng những giải pháp đắt đỏ, lãng phí tài nguyên cloud một cách vô ích. Thay vào đó, tụi mình tập trung tối ưu hóa hiệu năng backend ngay từ khâu thiết kế kiến trúc, kết hợp linh hoạt giữa các công nghệ để hệ thống vừa chạy mượt mà vừa tiết kiệm chi phí vận hành nhất có thể.

Đừng bao giờ để sự lười biếng trong việc tối ưu code bắt bạn phải trả giá bằng những hóa đơn cloud khổng lồ.

Nếu bạn cũng đang đau đầu với bài toán chi phí vận hành hệ thống, hoặc microservices của bạn đang chạy chậm chạp một cách khó hiểu, hãy nhắn cho tụi mình tại Thiện Quang Technologies. Chúng mình luôn sẵn sàng ngồi lại cùng bạn để tìm ra phương án tối ưu nhất, tránh những vết xe đổ mà tôi đã từng phải trả bằng rất nhiều tiền và nước mắt.